私は決して止めるべきではないテストアプリケーションを書いた。それはt.wait()
(t
はThread
オブジェクトです)を発行しますが、通知することはありません。なぜこのコードは終了するのですか? t
でメインスレッドが同期しているにもかかわらず、生成されたスレッドが実行されるため、このオブジェクトはロックされません。Javaは待機スレッドに暗黙的に通知しますか?
public class ThreadWait {
public static void main(String sArgs[]) throws InterruptedException {
System.out.println("hello");
Thread t = new MyThread();
synchronized (t) {
t.start();
Thread.sleep(5000);
t.wait();
java.lang.System.out.println("main done");
}
}
}
class MyThread extends Thread {
public void run() {
for (int i = 1; i <= 5; i++) {
java.lang.System.out.println("" + i);
try {
Thread.sleep(500);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
この結果、メインスレッドは5秒間待機し、この間に作業者は出力を行います。 5秒後にプログラムは終了します。 t.wait()
は待機しません。メインスレッドが5秒間スリープしない場合(この行にコメントする)、t.wait()
は実際にワーカーが終了するまで待機します。もちろん、join()
はここで使用する方法ですが、予期しないことにwait()
はjoin()
と同じことを行います。どうして?
おそらく、JVMは、1つのスレッドしか実行されていないため、メインスレッドに通知する機会がなく、デッドロックを解決する可能性があります。これが正しければ、文書化された機能ですか?私はWindows XP上でテストしてい
、
1秒または2秒間しか眠らないとどうなりますか?それから、メインスレッドがスレッドtが実行を終了するのを待つことになるでしょう。 – Renato