Возможно, вы захотите взглянуть на пакет java.util.concurrent.
Среда executor уже предоставляет средства для выполнения задач через пул потоков.Абстракция Future
позволяет дождаться завершения задач.
Соединение обоих позволяет легко координировать выполнение, разъединяя задачи, действия (потоки) и результаты.
Пример:
ExecutorService executorService = Executors.newFixedThreadPool(16);
List<Callable<Void>> tasks = null;
//TODO: fill tasks;
//dispatch
List<Future<Void>> results = executorService.invokeAll(tasks);
//Wait until all tasks have completed
for(Future<Void> result: results){
result.get();
}
Редактировать: Альтернативная версияиспользуя CountDownLatch
ExecutorService executorService = Executors.newFixedThreadPool(16);
final CountDownLatch latch;
List<Callable<Void>> tasks = null;
//TODO: fill tasks;
latch = new CountDownLatch(tasks.size());
//dispatch
executorService.invokeAll(tasks);
//Wait until all tasks have completed
latch.await();
И внутри ваших задач:
Callable<Void> task = new Callable<Void>()
{
@Override
public Void call() throws Exception
{
// TODO: do your stuff
latch.countDown(); //<---- important part
return null;
}
};