0

Thread クラスのインスタンスで wait() メソッドを呼び出すとどうなるでしょうか。

Thread t1 = new MyThread();
t1.wait();

スレッド t1 の状態はどうなりますか?

4

7 に答える 7

7

への呼び出し前と同じになりますwait()wait()の方法ですjava.lang.Object。オブジェクトに関連付けられた組み込みモニターで待機します。その場合、オブジェクトはスレッドであり、wait() の動作は変わりません。ただし、Thread オブジェクトをモニターとして使用するのはかなり奇妙です。プライベートで最終的なオブジェクトをモニターとして使用する必要があります。

于 2012-05-17T16:37:19.643 に答える
3

@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();
于 2012-05-17T16:43:38.147 に答える
2

異常なことは何も起こりません。他のスレッドが呼び出すまで、現在のスレッドを中断するだけt1.notifyです。t1単純なモニターとして使用しているだけです。

ところで、同期ブロックの外側でIllegalMonitorStateException呼び出しているため、コードは をスローします。wait

実際、特にスレッド クラスに関しては、Java のメソッドの選択が少し面倒だと思います。

たとえば、次のシナリオを考えてみましょう。

Thread t = new Thread();
t.start();
t.sleep(1000);

どのスレッドがスリープしますか? 現在のものは「明らかに」。

于 2012-05-17T16:35:30.523 に答える
1

これまでに述べられていないことを追加するには: 実際、スレッド オブジェクトで wait を呼び出すと、「通常とは異なる」何かが発生するか、少なくとも発生する可能性があります。

これは、Thread内部で内部的に待機しているためthisであり、控えめに言っても興味深い結果につながることは明らかです。

于 2012-05-17T16:59:48.573 に答える
1

呼び出しているのはまだ java.lang.Object の待機であるため、現在のスレッドのみが待機します (オブジェクト モニターを保持していると仮定します。そうでない場合、IllegalMonitorStateException がスローされます)。

于 2012-05-17T16:36:34.203 に答える
0

方法はありませんThread#waitwaitから継承Objectされ、同期に使用されます。したがってsynchronized(t1)、最初に持っていない限り、不正なモニター例外が発生するだけです。

t1.waitスレッドが終了するのを待ちません。別のスレッドによってスレッド オブジェクトにロックがかけられるのを待ちます。

于 2012-05-17T16:37:40.203 に答える