私は、Java Concurrency in Practiceという本を読んでいます。
CyclicBarrier
一定数の当事者がバリアポイントで繰り返しランデブーできるようにし、問題を一定数の独立した部分問題に分解する並列反復アルゴリズムで役立ちます。
問題を複数の独立したサブ問題に分割する方法の例を誰かが挙げることができますか?
私は、Java Concurrency in Practiceという本を読んでいます。
CyclicBarrier
一定数の当事者がバリアポイントで繰り返しランデブーできるようにし、問題を一定数の独立した部分問題に分解する並列反復アルゴリズムで役立ちます。
問題を複数の独立したサブ問題に分割する方法の例を誰かが挙げることができますか?
問題を複数の独立した部分問題に自分で分解する必要があります。
障壁は、各当事者が 2 番目の副問題に着手する前に、最初の副問題を完了することを保証します。これにより、最初のサブ問題からのすべてのデータが、2 番目のサブ問題が開始される前に利用できるようになります。
CyclicBarrier は、各ステップが事実上同一であるときに同じバリアが何度も必要になる場合に特に使用されます。たとえば、これは、段階的に行われるあらゆる種類のマルチスレッド リアリティ シミュレーションを実行するときに発生する可能性があります。CyclicBarrier は、すべてのスレッドが次のステップを開始する前に、各スレッドが特定のステップを完了していることを確認します。
CountDownLatch
とと の間には、もう 1 つの重要な違いがありCyclicBarrier
ます。つまり、同期されているCountDownLatch
スレッドは、他のスレッドに問題が発生したことを示すことができないため、他のスレッドは、協調操作全体を中止して続行するかどうかを選択できます。
スレッドのCycliBarrier
1 つが他のスレッドで待機している間にawait()
中断またはタイムアウトになったBrokenBarrierException
場合、現在のスレッドで が発生し、協力しているスレッドの 1 つで問題が発生したことを示します。
BrokenBarrierException
メソッドのJavadocで見つけることができる他の状況でも発生しますawait()
。
すぐに使用できるため、CountDownLatch
この機能は提供されません。
独立した部分問題に分解できるアルゴリズムがある場合
、CyclicBarrierは、すべてのスレッドが計算の最後に一致し、たとえば結果をマージするのに役立ちます。
Java 7 で導入されたFork/Joinフレームワークを使用すると、CyclicBarrier を使用しなくても同様のことを実行できることに注意してください。