この方法で実装したい Java のスレッドのグループがいくつかあるとしましょう。各時点で実行できるスレッドのグループは 1 つだけで、他のグループはその順番 (周期的) を待つ必要があります。
どのようにそうすることをお勧めしますか?
この方法で実装したい Java のスレッドのグループがいくつかあるとしましょう。各時点で実行できるスレッドのグループは 1 つだけで、他のグループはその順番 (周期的) を待つ必要があります。
どのようにそうすることをお勧めしますか?
a を使用しCyclicBarrier
て、スレッドの 1 つのグループが実行されている間、他のグループがまだ進行中であることを防ぐことができます。を使用して次のグループを解放できますCountDownLatch
。
あなたがすることは、続行する前に、現在のグループが循環バリアをリセットするのを待つことです。すべてのスレッドがラッチをカウントダウンした後、バリアはリセットされます。
例えば:
CyclicBarrier nextGroupContinue = new CyclicBarrier(1);
ExecutorService service = Executors.newCachedThreadPool();
final Runnable[][] groups = // init
try {
for (Runnable[] group : groups) {
int threads = group.length;
final CountDownLatch reset = new CountDownLatch(threads);
nextGroupContinue.await();
for (final Runnable runnable : group) {
service.execute(new Runnable() {
@Override
public void run() {
runnable.run();
reset.countDown();
}
});
}
reset.await();
nextGroupContinue.reset();
}
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
service.shutdownNow();