2011-04-12 66 views
5

我主要是在線程池上運行的CPU密集型操作。 然而,有一定數量的等待敵人的外部事件並非一致發生。 由於在Java中,據我所知,沒有一個線程池實現可以根據觀察到的任務吞吐量自動調整線程數量(如Microsoft的CLR 4),是否至少有一種方法可以手動告訴線程池在阻塞操作開始時增加其大小,在結束時減小大小?Java線程池超額認購

例如,對於8個內核,池大小爲8. 如果操作是CPU佔用率爲100%,則使用此固定池。 如果有一些阻塞操作,應該能夠做到這一點:

pool.increase(); 
waitForSpecialKeyPress(); 
pool.decrease(); 

這裏它是如何在微軟的C++異步庫正在做的是:Use Oversubscription to Offset Latency

回答

3

Java 7的ForkJoinPool具有ManagedBlocker,可用於通知有關被阻塞的線程的池,以便在需要時調度更多線程。

編輯:我忘了提及,這些類也可用於Java 6作爲jsr166y

4

你可以擴展ThreadPoolExecutor添加自己的increase()decrease()函數,它們可以做到簡單的setMaximumPoolSize(getMaximumPoolSize() +/- 1)

確保同步這些方法,以確保您不會意外地混淆池大小。