簡體   English   中英

有沒有辦法取消和重用 ExecutorService?

[英]Is there a way to cancel and reuse an ExecutorService?

我正在編寫一個 Java Fractal Explorer,分形計算是多線程完成的。 以前,我只是創建了一堆線程(與系統有處理器內核一樣多)並將它們保存在一個數組中,但這會導致一些問題並且不是很優雅,現在我想切換到Executors。

我需要的功能是:

  • 用戶可以隨時選擇分形圖像的新區域進行放大,因此應該可以隨時取消計算,並立即重新插入新任務
  • 為了獲得更好的性能,線程應該被重用(並在取消后繼續存在)

我的問題是 Java ExecutorService(我使用 Executors.newFixedThreadPool())在調用 shutdownNow()(取消)后提交新任務時拋出異常。 我當然可以只創建一個新的 ExecutorService,但隨后必須再次創建所有線程,據我所知,這非常昂貴(這是使用線程池的全部意義)。

所以基本上我需要的是一個使用線程池的 ExecutorService 實現,它可以在不關閉的情況下被取消,所以它可以被重用。

已經有這樣的東西還是我必須自己寫? (不會太難吧?;))

我當前的代碼可以在https://github.com/lucaswerkmeister/JFractalizer找到。

提前致謝,

盧卡斯

PS:當使用執行器時,我會將圖像分割成比線程數更多的部分,所以如果一個部分完成得更快,線程不會空閑,而是可以繼續處理圖像的另一部分。 盡管如此,如果所有部分都並行計算,而不是某些部分比其他部分開始計算,那將會很酷,但這只是一個獎勵。

當您完成ExecutorService並且不打算向其提交新任務時,您應該使用ExecutorService.html#shutdownNow()

如果您想繼續使用相同的ExecutorService ,您應該取消單個任務。

方法ExecutorService.html#submit返回可用於取消執行和/或等待完成的Future

您的任務應該能夠處理中斷。 所以你可以通過中斷它們來取消任務。

  boolean flag = Thread.interrupted();
  if(flag == true )
      throw new InterruptedException();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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