1. 程式人生 > >如何等待java執行緒池中所有任務完成

如何等待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());
		}