0

假設有一個線程池在具有4個CPU的計算機上運行,​​並且我想對該池執行加載動態控制。當有一些線程在池中運行時,是否可以更改corePoolSize?也就是說,當負載較低時,最多允許2個線程同時運行,但當負載較高時,允許4個線程。如果沒有,是否有適當的解決方案?動態更改ThreadPoolExecutor的corePoolSize

+1

「通常,核心和最大池大小隻在構建時設置,但也可以使用setCorePoolSize(int)和setMaximumPoolSize(int)動態更改。從https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html – Fildor

+0

您打算如何檢測高/低負載? – Fildor

+0

Re:「如果沒有,是否有適當的解決方案?」如果遇到最壞的情況,沒有什麼能阻止你實現你自己的線程池。 –

回答

1

當有一些線程在池中運行時,是否可以更改corePoolSize?

當然。 corePoolSizeThreadPoolExecutor中被標記爲volatile,因此您可以隨時根據機器的負載調用tpe.setCorePoolSize(...)。你甚至可以在你的池中產生一份工作來睡覺,檢查負載,並調整核心池的大小。你想添加另一個線程到核心大小當然要做到這一點。

也就是說,當負載低時,最多允許2個線程同時運行,但是當負載很高時,允許4個線程。

這聽起來很好,但重要的是要注意,只有當您發送到線程池的作業完全受CPU限制時,這纔是真正有意義的。任何IO(磁盤,網絡等)都意味着降低併發性沒有多大意義。

這就是說,我從來沒有覺得我必須這樣做,儘管我已經寫了大量的線程應用程序。