wait、notify、notifyAll メソッドは、Object クラスの最後のネイティブ メソッドです。したがって、これらのメソッドをサブクラスでオーバーライドすることはできません。Object クラスはすべてのクラスのスーパークラスであるため、プログラム内で wait およびその他のメソッドを呼び出すには次の 3 つの形式があります。
次のようにコードをコピーします。
wait();//方法 1:
this.wait();//方法 2:
super.wait();//方法 3
void notificationAll()
このオブジェクトの wait メソッドを呼び出すすべてのスレッドのブロックを解除します。このメソッドは、同期メソッドまたは同期ブロック内でのみ呼び出すことができます。現在のスレッドがロック保持者ではない場合、このメソッドは IllegalMonitorStateException をスローします。
無効通知()
オブジェクトの wait メソッドを呼び出してブロックを解除するスレッドをランダムに選択します。このメソッドは、同期メソッドまたは同期ブロック内でのみ呼び出すことができます。現在のスレッドがロック保持者ではない場合、このメソッドは IllegalMonitorStateException をスローします。
void wait()
スレッドは、notify() または NoticeAll を通じて他のスレッドによってウェイクアップされるまで待機状態に入ります。このメソッドは、同期されたメソッド内でのみ呼び出すことができます。現在のスレッドがロック保持者ではない場合、このメソッドは IllegalMonitorStateException をスローします。
void wait(long millis) と void wait(long millis,int nanos)
スレッドは、通知されるか、指定された時間が経過するまで待機状態になります。これらのメソッドは、同期されたメソッド内でのみ呼び出すことができます。現在のスレッドがロック保持者ではない場合、このメソッドは IllegalMonitorStateException をスローします。
Object.wait()、Object.notify()、および Object.notifyall() は、synchronized メソッド内または synchronized ブロック内に記述する必要があります。これは、これらのメソッドでは、現在 object.wait() メソッドを実行しているスレッドがそのメソッドを所有している必要があるためです。オブジェクト。オブジェクトのロック。現在のコンテキスト スレッドがオブジェクト ロックを所有していることが確実にわかっている場合でも、現在のコンテキストで object.wait() のようなステートメントを作成することはできません。のように:
次のようにコードをコピーします。
パッケージ edu.sjtu.erplab.ObjectTest;
クラスA
{
public synchronized void printThreadInfo() が InterruptedException をスローする
{
スレッド t=Thread.currentThread();
System.out.println("スレッドID:"+t.getId()+", スレッド名:"+t.getName());
}
}
パブリック クラス ObjectWaitTest {
public static void main(String args[])
{
A a=新しいA();
//printThreadInfo() メソッドは InterruptedException をスローするため、ここでは try-catch ブロックを使用する必要があります。
試す {
a.printThreadInfo();
待つ();
} catch (InterruptedException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
プログラムを実行するとエラーが報告され、結果は次のようになります。
スレッドID:1、スレッド名:main
スレッド「メイン」での例外 java.lang.IllegalMonitorStateException
java.lang.Object.wait(ネイティブメソッド)で
java.lang.Object.wait(Object.java:485) で
edu.sjtu.erplab.ObjectTest.ObjectWaitTest.main(ObjectWaitTest.java:24) で
正しい書き方はこうあるべきです
次のようにコードをコピーします。
パッケージ edu.sjtu.erplab.ObjectTest;
クラスA
{
public synchronized void printThreadInfo() が InterruptedException をスローする
{
スレッド t=Thread.currentThread();
System.out.println("スレッドID:"+t.getId()+", スレッド名:"+t.getName());
// this.wait(); // 待ち続けます
this.wait(1000);//1000ミリ秒待ちます
// super.wait(1000);
}
}
パブリック クラス ObjectWaitTest {
public static void main(String args[])
{
A a=新しいA();
//printThreadInfo() メソッドは InterruptedException をスローするため、ここでは try-catch ブロックを使用する必要があります。
試す {
a.printThreadInfo();
//待つ();
} catch (InterruptedException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
スレッド t=Thread.currentThread();
System.out.println("スレッドID:"+t.getId()+", スレッド名:"+t.getName());
}
}