Вы можете использовать CyclicBarrier
, чтобы предотвратить запуск одной группы потоков, пока другая группа продолжает развиваться. Вы можете освободить следующую группу, используя 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();