web-dev-qa-db-ja.com

CyclicBarrier / CountDownLatchとJavaでの結合の違いは何ですか?

javaのCyclicBarrier/CountDownLatchjoinの違いは何ですか? CyclicBarrierCountDownLatchの利点は何ですか?私の意見では、joinを使用するだけで、スレッドの実行が完了するのを待つことができます。

15
coderz

はい、「t.join()」は「t」スレッドを待機している現在のスレッドを終了させ、スレッドが他のスレッドを待機しているときにスレッドのチェーンを準備できます。ただし、CountDownLatch/CyclicBarrierの方が便利な場合もあります。

まず、CountDownLatch/CyclicBarrierでは、すべての作業スレッドを終了する必要はありません。スレッドは、アプリケーションの実行中は常に実行できます。彼らはただ「いくつかの仕事」が何度も行われていると言わせてくれます。さらに、N個のジョブとM個のスレッドがあり、N> Mの場合、一部のスレッドは、共通のバリアNが0になるまでジョブを数回実行できます。この例は、CountDownLatch/CyclicBarrierがM個のスレッド間でN個のタスクを共有するための非常に便利なプリミティブであることを示しています。

また、join()を使用するには、各スレッドに、join()を呼び出すための別のスレッドへの参照が必要です。特に3つ以上の作業スレッドがある場合は、コードが少し汚れます。 CountDownLatch/CyclicBarrierの1つのインスタンスの共有がより明確に見えます。

CyclicBarrierとCountDownLatchの主な違いは、CyclicBarrierは再利用可能であり、CountDownLatchは再利用できないことです。バリアを初期状態にリセットするreset()メソッドを呼び出すことにより、CyclicBarrierを再利用できます。

CountDownLatchは、アプリケーション/モジュールの起動時間などの1回限りのイベントに適しています。また、CyclicBarrierは、イベントが繰り返し発生する場合に使用できます。入力データが変更されるたびに同時に(再)計算します。

あなたはいくつかの良い例を見つけることができます:

http://javarevisited.blogspot.sg/2012/07/countdownlatch-example-in-Java.htmlhttp://javarevisited.blogspot.ru/2012/07/cyclicbarrier-例-Java-5-concurrency-tutorial.html

25
AnatolyG

join()は、1つのスレッドが完了するのを待ちます。 CountDownLatch.await()を使用すると、カウントダウンが0に達するまでNスレッドを待機できます。これを使用して、Nスレッドが同時に何かを開始するようにしたり(レースの開始など)、別のスレッドを1回ウェイクアップしたりできます。 N個のスレッドが特定のポイント(たとえば、レースの終了)に到達しました。

javadoc は、CountDownLatchの使用の具体例を示しています。それを読んで。

CyclicBarrierはCountDownLatchに似ていますが、定期的な調整ポイントを使用できます。

11
JB Nizet