0

CyclicBarrier と CountDownLatch の違いは何ですか? どちらも同じように見えるので、微妙な違いがあると思います。

私が間違っている場合はお知らせください。また、同じことを説明してください。

4

1 に答える 1

1

CountDownLatch は、1 回限りの同期に使用されます。CountDownLatch を使用している間、スレッドは countDown() を何度でも呼び出すことができます。await() を呼び出したスレッドは、ブロックされていない他のスレッドによる countDown() の呼び出しにより、カウントがゼロになるまでブロックされます。CountDownLatchのJavadoc には次のように記載されています。

await メソッドは、countDown() メソッドの呼び出しによって現在のカウントがゼロになるまでブロックします。その後、待機中のすべてのスレッドが解放され、後続の await の呼び出しはすぐに戻ります。...

もう 1 つの典型的な使用法は、問題を N 個の部分に分割し、その部分を実行してラッチをカウントダウンする Runnable で各部分を記述し、すべての Runnable を Executor にキューに入れることです。すべてのサブパートが完了すると、調整スレッドは await を通過できるようになります。(スレッドがこのように繰り返しカウントダウンする必要がある場合は、代わりに CyclicBarrier を使用してください。)

対照的に、サイクリック バリアは複数の同期ポイントに使用されます。たとえば、一連のスレッドがループ/フェーズ計算を実行しており、次の反復/フェーズを開始する前に同期する必要がある場合などです。CyclicBarrierのjavadocによると:

バリアは、待機中のスレッドが解放された後に再利用できるため、サイクリックと呼ばれます。

CountDownLatch とは異なり、await() への各呼び出しはいくつかのフェーズに属し、そのフェーズに属するすべての関係者が await() を呼び出すまで、スレッドをブロックさせることができます。CyclicBarrier でサポートされている明示的な countDown() 操作はありません。

于 2012-04-30T01:59:56.090 に答える