Помимо Thread.join()
, предложенного другими, Java 5 представила среду исполнения. Там вы не работаете с Thread
объектами. Вместо этого вы отправляете свои объекты Callable
или Runnable
исполнителю. Есть специальный исполнитель, который предназначен для выполнения нескольких задач и выдачи их результатов не по порядку. Это ExecutorCompletionService
:
ExecutorCompletionService executor;
for (..) {
executor.submit(Executors.callable(yourRunnable));
}
Затем вы можете повторно вызывать take()
, пока не останется больше Future<?>
объектов для возврата, что означает, что все они завершены.
Еще одна вещь, которая может иметь отношение к вашему сценарию, это CyclicBarrier
.
Средство синхронизации, которое позволяет всем потокам ожидать друг друга, чтобы достичь общей барьерной точки. CyclicBarriers полезны в программах, включающих группу потоков фиксированного размера, которые иногда должны ждать друг друга. Барьер называется циклическим, поскольку его можно использовать повторно после освобождения ожидающих потоков.