我有這個測驗代碼:
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println("run begins");
Thread.sleep(1000);
System.out.println("run ends");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
try {
executor.awaitTermination(0L, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
executor.shutdown();
System.out.println("-----------");
我預計,由于 Runnable 應該休眠 1 秒然后結束,然后執行程式等待其終止并關閉,最后System.out.println("-----------");執行。
但真正的輸出是:
-----------
run begins
run ends
執行順序對我來說沒有多大意義。似乎 ExecutorService.awaitXXX 和 shutdown() 不會阻塞主執行緒。這System.out.println("-----------");是要列印的第一行代碼,然后是 Runnable 代碼。
這是設計的行為嗎?
如果是,那么我的問題是:如果 awaitXXXX 方法沒有阻塞主執行緒,那么主執行緒如何知道何時ExecutorService完成?
uj5u.com熱心網友回復:
似乎 ExecutorService.awaitXXX 和 shutdown() 不會阻塞主執行緒
方法awaitTermination()確實阻塞了呼叫執行緒,但您已指定超時0秒數。參考javadoc:
在關閉請求后阻塞,直到所有任務都完成執行,或者發生超時,或者當前執行緒被中斷,以先發生者為準。
如果您期望這awaitTermination()會中斷提交的任務,那么您的期望是錯誤的,它不會那樣做。此方法僅允許您指定等待時間并報告執行程式是否已完成。
回傳: 如果此執行程式終止,則回傳 true;如果在終止前超時,則回傳 false
方法shutdown()也不會中斷之前提交的任何任務:
啟動有序關閉,其中執行先前提交的任務,但不會接受新任務。
如果您想嘗試中斷提交的任務,請使用shutdownNow().
嘗試停止所有正在執行的任務,停止等待任務的處理,并回傳等待執行的任務串列。
注意:使用 ofshutdown()是首選方法。
uj5u.com熱心網友回復:
來自JavadocsExecutorService#awaitTermination:
在關閉請求后阻塞,直到所有任務都完成執行
這意味著它awaitTermination只會在關閉請求之后作業,因此您需要在shutdown()之前呼叫awaitTermination()。
此外,正如@Alexander Ivanchenko 的另一個回答所提到的,將超時設定為 0L 將不會等待任何內容,并awaitTermination指示執行緒是否通過回傳值及時終止。如果您的InterruptedException主執行緒被另一個執行緒中斷,則會拋出 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496630.html
上一篇:Thread.Sleep()不適用于Cv2.ImShow、OpenCvSharp、C#
下一篇:多執行緒初學者查詢(C )
