Thread クラスのインスタンスで wait() メソッドを呼び出すとどうなるでしょうか。
Thread t1 = new MyThread();
t1.wait();
スレッド t1 の状態はどうなりますか?
Thread クラスのインスタンスで wait() メソッドを呼び出すとどうなるでしょうか。
Thread t1 = new MyThread();
t1.wait();
スレッド t1 の状態はどうなりますか?
への呼び出し前と同じになりますwait()
。wait()
の方法ですjava.lang.Object
。オブジェクトに関連付けられた組み込みモニターで待機します。その場合、オブジェクトはスレッドであり、wait() の動作は変わりません。ただし、Thread オブジェクトをモニターとして使用するのはかなり奇妙です。プライベートで最終的なオブジェクトをモニターとして使用する必要があります。
@Tudor(および他の人)が述べたように、自分がいないwait()
オブジェクトを呼び出すことはできないsynchronized
ので、を取得しIllegalMonitorStateException
ます。スレッドは影響を受けません。
Thread t1 = new MyThread();
// this will throw
t1.wait();
ほとんどの場合、を呼び出す必要がありますt1.join()
。これは、スレッドが終了するのを待ってから続行します。ただし、まだ開始していないThread t1
ため、参加は永久に待機します。スレッドがすでに開始されている場合は、Thread.run()
メソッドが終了すると(戻り値が返されるか、例外がスローされるため)、join()
が返されます。
Thread t1 = new MyThread();
t1.start();
// this waits for t1 to finish
t1.join();
異常なことは何も起こりません。他のスレッドが呼び出すまで、現在のスレッドを中断するだけt1.notify
です。t1
単純なモニターとして使用しているだけです。
ところで、同期ブロックの外側でIllegalMonitorStateException
呼び出しているため、コードは をスローします。wait
実際、特にスレッド クラスに関しては、Java のメソッドの選択が少し面倒だと思います。
たとえば、次のシナリオを考えてみましょう。
Thread t = new Thread();
t.start();
t.sleep(1000);
どのスレッドがスリープしますか? 現在のものは「明らかに」。
これまでに述べられていないことを追加するには: 実際、スレッド オブジェクトで wait を呼び出すと、「通常とは異なる」何かが発生するか、少なくとも発生する可能性があります。
これは、Thread
内部で内部的に待機しているためthis
であり、控えめに言っても興味深い結果につながることは明らかです。
呼び出しているのはまだ java.lang.Object の待機であるため、現在のスレッドのみが待機します (オブジェクト モニターを保持していると仮定します。そうでない場合、IllegalMonitorStateException がスローされます)。
方法はありませんThread#wait
。wait
から継承Object
され、同期に使用されます。したがってsynchronized(t1)
、最初に持っていない限り、不正なモニター例外が発生するだけです。
t1.wait
スレッドが終了するのを待ちません。別のスレッドによってスレッド オブジェクトにロックがかけられるのを待ちます。