如何等待java線程池中所有任務完成
一、等待線程池所有線程完成:
有時候我們需要等待java thread pool中所有任務完成後再做某些操作,如想要等待所有任務完成,僅需調用threadPool.awaitTermination()方法即可,請查看如下代碼:
ExecutorService threadPool = Executors.newFixedThreadPool(ConfigUtil.ACCESSDB_THREAD_POOL_SIZE);
for(String key:noneExsitKeys){
ConcurrentAccessDBJob job = new ConcurrentAccessDBJob(key,userLevel,dao,service);
threadPool.submit(job);
}
threadPool.shutdown();
try {//等待直到所有任務完成
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
二、等待線程池指定線程完成:
如果我們僅僅想等待某些線程完成,我們可以利用Future,調用future.get()可以阻塞主線程等待子線程完成。通過把調用每個線程的Future放入Map或List中,然後遍曆需要等待完成線程的Future,調用future.get() 方法:
Map<String, Future<?>> jobFutureMap=new HashMap<String, Future<?>>();
for(String key:noneExsitKeys){
ConcurrentAccessDBJob job = new ConcurrentAccessDBJob(key,userLevel, dao, service);
Future<?> future = threadPool.submit(job);
jobFutureMap.put(key, future);
}
for(String key:noneExsitKeys){
Future<?> future =jobFutureMap.get(key);
future.get();//調用此方法會使主線程等待子線程完成
System.out.println("---future.idDone()"+future.isDone());
}
最後更新:2017-04-03 12:56:32