簡體   English   中英

清理使用ExecutorService提交的線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM