假設有一個線程池在具有4個CPU的計算機上運行,並且我想對該池執行加載動態控制。當有一些線程在池中運行時,是否可以更改corePoolSize?也就是說,當負載較低時,最多允許2個線程同時運行,但當負載較高時,允許4個線程。如果沒有,是否有適當的解決方案?動態更改ThreadPoolExecutor的corePoolSize
0
A
回答
1
當有一些線程在池中運行時,是否可以更改corePoolSize?
當然。 corePoolSize
在ThreadPoolExecutor
中被標記爲volatile
,因此您可以隨時根據機器的負載調用tpe.setCorePoolSize(...)
。你甚至可以在你的池中產生一份工作來睡覺,檢查負載,並調整核心池的大小。你想添加另一個線程到核心大小當然要做到這一點。
也就是說,當負載低時,最多允許2個線程同時運行,但是當負載很高時,允許4個線程。
這聽起來很好,但重要的是要注意,只有當您發送到線程池的作業完全受CPU限制時,這纔是真正有意義的。任何IO(磁盤,網絡等)都意味着降低併發性沒有多大意義。
這就是說,我從來沒有覺得我必須這樣做,儘管我已經寫了大量的線程應用程序。
相關問題
- 1. 爲什麼ThreadPoolExecutor在keepAliveTime之後減少corePoolSize以下的線程?
- 2. 傳遞給ThreadPoolExecutor/ScheduledThreadPoolExecutor的推薦corePoolSize是什麼?
- 3. 動態更改
- 4. 動態更改
- 5. 動態更改
- 6. 動態更改CF7狀態
- 7. 動態列更改
- 8. 動態更改DIv
- 9. 動態更改CSS
- 10. 更改CSS動態
- 11. 動態更改UIPopoverController
- 12. 動態更改SharedPreferences
- 13. 動態更改preferredContentSize?
- 14. 動態更改javascript
- 15. 動態更改jquery
- 16. 動態更改從
- 17. 動態更改JComboBox
- 18. 動態更改HTML
- 19. 動態更改ProxyCreationEnabled
- 20. 動態更改app_themes
- 21. 動態更改android:configChanges
- 22. Symfony的 - 更改動態
- 23. 動態更改NSWindow的contentViewController
- 24. 動態更改div的ID?
- 25. jQuery的CSS:動態更改
- 26. 動態更改CardView的BackgroundColor
- 27. jsf managedbean的動態更改
- 28. 動態更改jquery動畫
- 29. 動態更改撥動開關狀態
- 30. 動態更改OpenEars間距(動態)
「通常,核心和最大池大小隻在構建時設置,但也可以使用setCorePoolSize(int)和setMaximumPoolSize(int)動態更改。從https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html – Fildor
您打算如何檢測高/低負載? – Fildor
Re:「如果沒有,是否有適當的解決方案?」如果遇到最壞的情況,沒有什麼能阻止你實現你自己的線程池。 –