[英]Cleaning up thread submitted using ExecutorService
我的代碼如下:
public Future<String> getFuture() {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> future = executorService.submit(() -> {
//do something
return "test string";
});
executorService.shutDown(); // is this correct?
return future;
}
我從其他班級調用此服務來獲得未來:
Future<String> future = getFuture();
String result = future.get();
future.cancel(true); // will this assure that there wont be any thread leak?
現在出了executorService.shutDown()
和future.cancel(true)
,這將確保不會出現線程泄漏?
注意,當我在Thread.getAllStackTraces()
的結果中檢查當前正在運行的線程時調用future.cancel(true)
,我仍然可以找到未來執行的線程。
你問的是錯誤的問題!
在方法中創建服務然后將其丟棄就沒有意義。
創建該服務實例並非免費提供。 這種抽象的整個想法是確保有效利用基礎設施元素!
換句話說:退后一步,重新設計你的設計; 所以這個服務成為某個類的領域 ,例如! 是的,這可能會變得復雜。 但最有可能的是,與繼續你問題中顯示的方法相比,在那個角落花費時間會花更多的錢。
現在出了executorService.shutDown()和future.cancel(true),這將確保不會出現線程泄漏?
沒有一個。
executorService.shutdown()將繼續運行當前任務並拒絕新提交的任務。
如果當前正在運行,則future.cancel(true)將中斷相應的任務(但是您負責檢查任務是否被中斷並盡快完成任務的執行)
注意,當我在Thread.getAllStackTraces()的結果中檢查當前正在運行的線程時調用future.cancel(true)后,我仍然可以找到未來執行的線程。
正如我之前提到的,future.cancel(true)不會停止該線程。 它只發送一個中斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.