我在寫Java分形瀏覽器,分形計算是多線程完成的。以前,我只是創建了一堆線程(與系統具有處理器核心一樣多)並將它們保存在一個數組中,但這會導致幾個問題,並且不是很優雅,現在我想切換到Executors。有沒有辦法取消和重用ExecutorService?
我需要的功能是:
- 用戶可以在任何時間,選擇分形圖像的新區域放大到,所以它應該可以隨時取消的計算,立即重新插入新任務
- 爲了獲得更好的性能,線程應該被重複使用(和生存取消)
我的問題是,Java的ExecutorService的(我用的Executors.newFixedThreadPool())當我提交新拋出異常呼叫後的任務tdownNow()(取消)。我當然可以創建一個新的ExecutorService,但是所有線程都必須重新創建,就我所知,這是相當昂貴的(這是使用線程池的關鍵)。
所以基本上我需要的是使用可無需將其關閉取消一個線程池的ExecutorService的實現,所以它可以重複使用。
有沒有這樣的事情,或者我必須自己寫嗎? (不能太狠了吧;))
我當前的代碼可以在https://github.com/lucaswerkmeister/JFractalizer找到。
由於提前,
盧卡斯
PS:當使用執行人,我將圖像分割中更多的部分之外還有線程,因此,如果一個部分完成得更快,線程是不會閒着,但可以繼續在圖像的另一部分。如果所有部分都是平行計算的,而不是某些部分的起點晚於其他部分,那將很酷,但這只是一種獎勵。
shutdownNow時是不一樣的取消,就應該取消,當你提交的可運行/調用到執行服務時,返回的未來。除非您打算不再提交任務,否則不應該調用shutdown或shutdownNow。 – sjr
爲什麼不取消關閉整個ExecutorService的個別任務? – reprogrammer
謝謝你們倆。我完全忘記了,即使有這樣的事情,這當然會讓我取消個人的任務。 –