4

我有一個長時間運行的進程,它監聽事件並執行一些緊張的處理。動態線程池

目前我使用Executors.newFixedThreadPool(x)來節制同時運行的作業數量,但取決於一天中的時間和其他各種因素,我希望能夠動態增加或減少併發線程數。

如果我減少併發線程的數量,我希望當前正在運行的作業很好地完成。

是否有Java庫讓我控制並動態增加或減少線程池中運行的併發線程數量? (該類必須實現ExecutorService)。

我必須自己實施嗎?

回答

3

有在ThreadPoolExecutor

public void setCorePoolSize(int corePoolSize) 

設置線程的內核數量看看下面的API。這將覆蓋構造函數中設置的任何值。

如果新值比當前值小,多餘的現有線程將被當他們未來成爲閒置終止。

如果更大,如果需要,新線程將啓動以執行任何排隊的任務。

初始化:

如果T:使用以下API

((ThreadPoolExecutor)service).setCorePoolSize(newLimit);//newLimit is new size of the pool 

重要提示

ExecutorService service = Executors.newFixedThreadPool(5); 

在需要的基礎上,調整大小線程池他的隊列已滿,並且線程數的新值大於或等於之前定義的maxPoolSize,任務將被拒絕。

因此正確設置maxPoolSizecorePoolSize的值。

+0

它不適合我。我使用visual vm查看線程池大小,並始終顯示已設置的初始池大小。 – Innovation

+0

用代碼發佈一個新問題來分析問題。 –

+0

您還需要在創建newFixedThreadPool之後設置maxPoolSize()。如果您沒有這樣做,那麼在這種情況下,maxPoolSize值將設置爲分配給newFixedThreadPool的值,之後如果您想將setCorePoolSize設置爲大於newFixedThreadPool的值,將不會採用新的池大小,因爲在這種情況下,它將大於maxPoolSize。 – Innovation