2012-01-11 5 views
4

thread-2のthread-1によって呼び出されたときのwait()メソッドとjoin()メソッドの両方は、スレッド2がいつか、またはスレッド2が完了するまでスレッド1を待ちます。wait(long timeout)とjoin(long millis)の違いは?

我々はこれらのメソッドのオーバーロードされたバージョンを使用している場合は、スレッド1が実行可能になります待機(長いタイムアウト)の場合は、その後

  1. 、待ち時間(長いタイムアウト)をIEと(長いミリ秒)に参加します通知(または通知)またはタイムアウト(いずれか最初のいずれか)が発生します。

    join(long millis)の場合、thread-2はスレッド2が完了したとき、またはタイムアウトが発生したとき(どちらか早い方のどちらか)に実行可能になります。

したがって、これら2つの実装の違いは何ですか?私が思った

一部はこれらです: - 待機用

  1. ()は、私たちは私たちが待っているオブジェクトのロックを持っている必要があります。 join()の場合、これらは必要ありません。
  2. wait()を実行すると、スレッドは取得したロックを削除し、再度実行されるとロックを再度取得します。しかし、参加はどうですか?同期ブロック(またはメソッド)から実行された場合、スレッドは結合を実行した後にロックを削除しますか?
+3

答えは問題です。呼び出しスレッドに通知されるまでブロックを待ちます。結合されたスレッドが完了するまでブロックを結合します。結合に関わるロックはありません。 –

答えて

6

「リリース」プロセスは全く異なります。notify()に基づいている場合は、もう1つはスレッドの完了に基づいています。彼らは完全に異なる目的を果たす完全に異なる呼び出しです。実際に

、内部Javaコードが彼らのためにロックを取得(およびwait/notify自体を使用しています)として、(私はすぐにこれらの警告を見つけることができませんが)Threadモニター上wait()を呼び出すための明示的な警告ないがあります。

しかし、現在実行中のスレッドがそれを所有している場合は、no、Threadjoin()を呼び出すとは、モニターを解放しません。

基本的に、それらを似ているとはみなさないでください。一つはスレッドが終了するのを待つためのものです。もう一つは協調的調整を待つためのものです。

関連する問題