2012-12-02 30 views
1

我在寫Java分形瀏覽器,分形計算是多線程完成的。以前,我只是創建了一堆線程(與系統具有處理器核心一樣多)並將它們保存在一個數組中,但這會導致幾個問題,並且不是很優雅,現在我想切換到Executors。有沒有辦法取消和重用ExecutorService?

我需要的功能是:

  • 用戶可以在任何時間,選擇分形圖像的新區域放大到,所以它應該可以隨時取消的計算,立即重新插入新任務
  • 爲了獲得更好的性能,線程應該被重複使用(和生存取消)

我的問題是,Java的ExecutorService的(我用的Executors.newFixedThreadPool())當我提交新拋出異常呼叫後的任務tdownNow()(取消)。我當然可以創建一個新的ExecutorService,但是所有線程都必須重新創建,就我所知,這是相當昂貴的(這是使用線程池的關鍵)。

所以基本上我需要的是使用可無需將其關閉取消一個線程池的ExecutorService的實現,所以它可以重複使用。

有沒有這樣的事情,或者我必須自己寫嗎? (不能太狠了吧;))

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

由於提前,

盧卡斯

PS:當使用執行人,我將圖像分割中更多的部分之外還有線程,因此,如果一個部分完成得更快,線程是不會閒着,但可以繼續在圖像的另一部分。如果所有部分都是平行計算的,而不是某些部分的起點晚於其他部分,那將很酷,但這只是一種獎勵。

+0

shutdownNow時是不一樣的取消,就應該取消,當你提交的可運行/調用到執行服務時,返回的未來。除非您打算不再提交任務,否則不應該調用shutdown或shutdownNow。 – sjr

+0

爲什麼不取消關閉整個ExecutorService的個別任務? – reprogrammer

+0

謝謝你們倆。我完全忘記了,即使有這樣的事情,這當然會讓我取消個人的任務。 –

回答

2

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

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

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

1

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

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

我只是回來,而不是拋出異常,是嗎? –

+0

是啊,那完全沒問題.. –

相關問題