Javaのwaitとsleepの違いを詳しく説明します。

2296 ワード

1.概要
この短い文章の中で、核心Javaの標準sleep()とwait()の方法を見て、それらの違いと類似点を知る。
2.waitとsleepの一般的な違い
簡単に言えば、wait()はスレッド同期のための例示的な方法である。
Java.lang.Objectで定義されているので、どのオブジェクトでも呼び出すことができますが、synchronizedブロックからしか呼び出されません。オブジェクトのロックを解除して、他のスレッドがロックに飛び込むことができます。
一方、Thread.sleep()は、任意のコンテキストから呼び出すことができる静的な方法である。Thread.sleep()は現在のスレッドを停止し、ロックを解除しません。
以下はこの二つのコアAPIに対する初歩的な理解である。

private static Object LOCK = new Object();
 
private static void sleepWaitExamples() 
 throws InterruptedException {
 
 Thread.sleep(1000);
 System.out.println(
  "Thread '" + Thread.currentThread().getName() +
  "' is woken after sleeping for 1 second");
 
 synchronized (LOCK) {
  LOCK.wait(1000);
  System.out.println("Object '" + LOCK + "' is woken after" +
   " waiting for 1 second");
 }
}
この例を実行すると、以下の出力が生成されます。
Thread‘main’is woken after sleepping for 1 second
Object‘java.lang.Object@31befd9f'is woken after waiting for 1 second
3.waitとsleepを起動する
sleep()法を使うと,スレッドは指定された時間間隔後に起動し,中断されない限り起動する。
wait()に対して、起こし方がちょっと複雑です。待ち時間のモニター上のnotify()またはnotifyAll()方法を呼び出してスレッドを起動することができます。
待ち状態のスレッドを全て起動する場合は、notifyAll()を使ってください。wait()メソッド自体と同様に、同期コンテキストからnotify()とnotifyAll()を呼び出す必要があります。
例えば、ここで待ってもいいです。

synchronized (b) {
 while (b.sum == 0) {
  System.out.println("Waiting for ThreadB to complete...");
  b.wait();
 }
 
 System.out.println("ThreadB has completed. " + 
  "Sum from that thread is: " + b.sum);
}
そして、これはもう一つのスレッドが待ちスレッドを起動する方法です。モニタでnotifyを呼び出します。

int sum;
 
@Override
public void run() {
 synchronized (this) {
  int i = 0;
  while (i < 100000) {
   sum += i;
   i++; 
  }
  notify(); 
 } 
}
この例を実行すると、以下の出力が生成されます。
Waiting for ThreadB to complete…
 ThreadBはすでに完了しました。スレッドの合計は704982704です。
4.結論
これはJavaの中で待つと睡眠の意味の速い入門です。
一般的に、sleep()を使ってスレッドの実行時間を制御し、wait()を使ってマルチスレッド同期を行うべきである。もちろん、基礎知識を深く理解した上で、もっと探求するべき内容があります。
以上は小编が绍介したJava中waitとsleepの违いを详しくまとめました。皆さんに助けてほしいです。ここでも私たちのサイトを応援してくれてありがとうございます。