Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでロックを取得せずにwait()メソッドを呼び出すことはできますか?


いいえ wait()を呼び出すことはできません メソッドロックを取得せずに 。 Javaでは、ロックが取得されたら、 wait()メソッド()を呼び出す必要があります。 そのオブジェクトでタイムアウトありまたはタイムアウトなし)。 wait()を呼び出そうとしている場合 ロックを取得せずにメソッドを実行すると、 java.lang.IllegalMonitorStateExceptionがスローされる可能性があります 。

public class ThreadStateTest extends Thread {
   public void run() {
      try {
         wait(1000);
      } catch(InterruptedException ie) {
         ie.printStackTrace();
      }
   }
   public static void main(String[] s) {
      ThreadStateTest test = new ThreadStateTest();
      test.start();
   }
}

上記の例では、 wait()を呼び出す必要があります ロックを取得せずにメソッドを実行して、 IllegalMonitorStateExceptionを生成します 実行時に。この問題を修正するには、 wait()を呼び出す前にロックを取得する必要があります メソッドを作成し、 run()を宣言します メソッド同期

出力
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at ThreadStateTest.run(ThreadStateTest.java:4)

  1. JavaでinvokeLater()メソッドを呼び出すにはどうすればよいですか?

    invokeLater() メソッドは静的です SwingUtilitiesのメソッド クラスであり、タスクを非同期に実行するために使用できます。 AWT イベントディスパッチャスレッド 。 SwingUtilities.invokeLater() メソッドはSwingUtilities.invokeAndWait()のように機能します ただし、リクエストはイベントキューに配置されます そしてすぐに戻る 。 invokeLater() メソッドは、実行可能内のコードのブロックを待機しません ターゲットによって参照されます 実行します。 構文 public static void in

  2. JavaでJPanelのpaintComponent()メソッドを実装するにはどうすればよいですか?

    JPanel は軽量のコンテナであり、見えない コンポーネント Javaで。 JPanelのデフォルトのレイアウトはFlowLayout 。 JPanelを作成したら、他のコンポーネントを JPanelに追加できます。 add()を呼び出してオブジェクトを作成します コンテナから継承されたメソッド クラス。 paintComponent() このメソッドは、 JPanelで何かを描画するために必要です 背景色を描く以外。このメソッドは、 JPanelにすでに存在します スーパーを使用する必要があるようにクラス このメソッドに何かを追加し、グラフィックスを取る宣言 オブジェクト パラメータ