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();
}
Edit: Alternative Version using 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;
}
};
4 回答
您可能想要查看java.util.concurrent包 .
ExecutorService
Executors
Future
执行程序框架已经提供了通过线程池执行任务的方法 .
Future
抽象允许等待任务的完成 .将两者放在一起可以让您轻松协调执行,解耦任务,活动(线程)和结果 .
例:
Edit: Alternative Version using CountDownLatch
在你的任务中:
您想知道每个任务的完成位置 . 我会有另一个完成任务报告的队列 . (每个任务一个对象/消息)当此计数达到您创建的任务数时,它们都已完成 . 此任务报告还可以包含任务的任何错误和计时信息 .
您可以让每个使用者检查队列在出队时是否为空,如果是,则在主线程等待的时候脉冲condvar(或监视器,因为我相信这就是Java所拥有的) .
让线程检查全局布尔变量(标记为volatile)是一种让线程知道它们应该停止的方法 .
你可以为每个线程使用join()方法..所以在完成所有线程之前你的主线程不会结束!通过这种方式,您实际上可以找出所有线程是否已完成!