Java - スリープ、待機、通知の違い
どちらの方法も sleep() および wait() 現在のスレッドを一時停止し、一定時間後または別のプロセスによってトリガーされた通知の後に実行パスを再開します.wait は、 notify. wait et notify ブロックで呼び出される synchronized これは相互排他に使用されます。メソッド notify は、wait.
wait() と notify() の例
このプログラムでは、プロセス B がプロセス A 内で実行され、相互排他ゾーンを作成して、プロセス A がブロックの後にステートメントを実行するのをブロックして防止します try/catch.public class Thread_A {Output
public static void main(String[] args) {
Thread Thread_B = new Thread(new Runnable() {
@Override
public void run() {
synchronized (this) {
int i=0;
while(i<100)
i++;
//スレッドを解放する A
notify();
}
}
});
Thread_B.start();
synchronized(Thread_B) {
try {
System.out.println("スレッド A がブロックされています - スレッド B を待っています"+
"完了する");
//A
Thread_B.wait();
} catch (InterruptedException e) {
// TODO 自動生成された catch block
e.printStackTrace();
}
System.out.println("スレッド B が完了しました - スレッド A が解放されました");
}
}
}
スレッド A がスタックしていますスレッド B の完了を待っています
スレッド B が終了しました。スレッド A が解放されます
sleep() の例
sleep() は、プロセスをロックし、一定時間実行します。このメソッドは、時間との同期 (例: 4 秒後にウェイクアップ) や、スリープして他のスレッドを実行させるために使用されます.
public class Sleep {Output
public static void main(String[] args) {
ThreadA a = new ThreadA();
a.start();
ThreadB b = new ThreadB();
b.start();
}
静的クラス ThreadA extends Thread{
@Override
public void run() {
try {
System.out.println("Thread A");
スリープ(4000);
System.out.println( "スレッドA:4秒間眠りました");
} catch (InterruptedException e) {
// TODO 自動生成された catch block
e.printStackTrace();
}
}
}
静的クラス ThreadB extends Thread{
@Override
public void run() {
System.out.println("スレッド B");
int sum = 0;
for(int i = 0 ; i < 50; i++)
sum +=i;
System.out.println("スレッドB:完了");
}
}
}
スレッド Aプロセス A はプロセス B の前に開始されましたが、プロセス A が処理を行っている間に B は処理を行いました眠っていて、最初の
スレッド B
スレッド B: 終了しました
スレッド A: 4 秒間寝ました