В качестве альтернативы вы должны рассмотреть CyclicBarrier
или CountDownLatch
.
Они менее подвержены ошибкам, обычно менее многословны и довольно эффективны по сравнению с пользовательскими флагами завершающих потоков.
Есть свои особенности, но они довольно близки.
CountDownLatch
связывает счетчик операций countDown для достижения, в то время как CyclicBarrier
связывает счетчик отдельного потока, вызывающего await()
для применения определенной обработки.
С CyclicBarrier
это может выглядеть так:
CyclicBarrier barrier = new CyclicBarrier(4, () -> {
System.out.println("Program Ended");
});
Здесь 4
- это номер потока, который должен ждать на барьере, и «Программа завершена» будет отображаться, когда 4 отдельных потока «достигнут» барьера.
Нить может достичь барьера после их обработки, например:
new Thread(() -> {
while (!done()) {
....
}
barrier.await(); // replace the flag boolean
});
Обратите внимание, что барьер является циклическим. Это означает, что его можно использовать повторно после активации. В отличие от CountDownLatch
.