Java中在使用Executors線程池時,有時場景需要主線程等各子線程都運行完畢後再執行。這時候就需要用到ExecutorService接口中的awaitTermination方法,我們來看看源碼中對該方法的說明:
大概意思是這樣的:該方法調用會被阻塞,並且在以下幾種情況任意一種發生時都會導致該方法的執行: 即shutdown方法被調用之後,或者參數中定義的timeout時間到達或者當前線程被打斷,這幾種情況任意一個發生了都會導致該方法在所有任務完成之後才執行。第一個參數是long類型的超時時間,第二個參數可以爲該時間指定單位。
比如應用場景爲線程池的有效執行時間爲20S,20S之後不管子任務有沒有執行完畢,都要關閉線程池。代碼如下:
ExecutorService es = Executors.newFixedThreadPool(10);
es.execute(new Thread());//執行子線程任務
try {
es.shutdown();
if(!es.awaitTermination(20,TimeUnit.SECONDS)){//20S
System.out.println(" 到達指定時間,還有線程沒執行完,不再等待,關閉線程池!");
es.shutdownNow();
}
} catch (Throwable e) {
// TODO Auto-generated catch block
es.shutdownNow();
e.printStackTrace();
}
與shutdown()方法結合使用時,尤其要注意的是shutdown()方法必須要在awaitTermination()方法之前調用,該方法纔會生效。否則會造成死鎖。