2012-01-12 46 views
1

我有大量的異步任務並行運行。所有的任務可以分爲兩種類型,一種是A型(耗時),另一種是B型(執行速度更快,執行速度更快)。 帶有一個具有x池大小的ScheduledThreadPoolExecutor,最終在某個時刻,所有線程都忙於執行類型A,因爲結果類型B被阻塞和延遲。 我試圖完成的是運行類型A任務並行類型B,並且我想在這兩個類型中的任務在其組中執行並行運行的性能。運行ScheduledThreadPoolExecutor的兩個實例

您是否認爲謹慎使用ScheduledThreadPoolExecutor爲類型A和B完全使用自己的線程池?你看到這個方法有什麼問題嗎?

回答

1

不,這似乎是合理的。 我正在做類似的事情,即我需要以串行方式執行任務,具體取決於某些ID,例如,所有針對id =「1」組件的任務都需要串行執行,並且與所有其他用於具有不同ID的組件的任務並行執行。 所以基本上我需要爲每個不同的組件分別執行一個任務隊列,從每個特定的隊列中一個接一個地抽取任務。 爲了實現我使用

Executors.newSingleThreadExecutor(new JobThreadFactory(componentId)); 

爲每個組件。 此外,我需要的ExecutorService針對不同類型的任務未綁定到componentIds,爲我創造額外的ExecutorService實例

Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE, new JobThreadFactory()); 

這工作得很好,至少我的情況。 我可以想到的唯一的問題是,如果需要有序執行任務,例如 task2 NEEDS需要在task1之後執行等等......但我在這裏懷疑這種情況......

+0

聽起來不錯。在關於您選擇使用Executor util與ScheduledThreadPoolExecutor等實現的安全說明中。任何具體原因?你還有什麼JobThreadFactory類做。 (想知道這是否應該是一個安全Qs?) – TechJack 2012-01-13 03:48:04

+0

我使用java.util.concurrent.Executors工廠方法,因爲這些方法將我從具體的ExecutorService實現的複雜構造函數中屏蔽掉了。例如,newSingleThreadExecutor工廠方法調用6參數ThreadPoolExecutor構造函數...這樣做的缺點是,您無法控制用於存放等待執行的任務的隊列impl,這可能導致一些內存泄漏等(如果任務執行速度慢於提交執行)。工廠可以用來命名線程(就像我這樣做),記錄任務exec開始,結束等等... – Svilen 2012-01-13 07:26:27