スレッド通信の例:2つのスレッドを使用して1〜100を印刷します。スレッド1、2は交互に印刷します。関連
する3つのメソッド
は、このメソッドが実行されると待機し、現在のスレッドがブロッキング状態に入り、同期モニターを解放します。
このメソッドが実行されると、notifyは
待機中のスレッドをウェイクアップします。複数のスレッドが待機している場合、優先度の高いスレッドがウェイクアップされます。Notifyall。このメソッドが実行されると、待機中のすべてのスレッドがウェイクアップされます。
注意点:
1。wait()notify()notifyall()メソッドの呼び出しは、同期コードブロックまたは同期メソッドでのみ使用できます。
2.wait()notify()notifyall()3つのメソッドの呼び出し元は、同期コードブロックまたは同期メソッドの同期モニターである必要があります。そうでない場合、illegalMonitorStateExceptionが発生します
。3.wait()notify()notifyall()はlavaで定義されます。 .long.Objectクラス
//线程通信的例子:使用两个线程打印1-100.线程1,2交替打印
class Number implements Runnable{
private static int number = 1;
@Override
public void run() {
while (true){
synchronized (this) {
notify();
if (number <= 100) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + number);
number++;
//使得调用如下wait()方法的线程进入阻塞状态
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
break;
}
}
}
}
public static class why {
public static void main(String[] args) {
Number number = new Number();
Thread t1 = new Thread(number);
Thread t2 = new Thread(number);
t1.start();
t2.start();
t1.setName("线程1");
t2.setName("线程2");
}
}
}
面接の質問:
Sleepメソッドとwaitメソッドの類似点と相違点
1.類似点:メソッドが実行されると、現在のスレッドはブロッキング状態に入ることができます
。2。相違点:(1)2つのメソッド宣言は異なる位置にあります。sleepはスレッドで宣言されます。クラスとスリープはオブジェクトクラスで宣言されます。待機;(2)呼び出し要件が異なります:スリープは必要なシーンで呼び出すことができます;待機は同期コードブロックまたは同期メソッドで使用する必要があります;(3)同期モニターを解放します。両方のメソッドが同期コードブロック内にあるか、同期メソッドでは、sleepはロックを解放しません。waitはロックを解放します。