假设有一个线程池在具有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:“如果没有,是否有适当的解决方案?”如果遇到最坏的情况,没有什么能阻止你实现你自己的线程池。 –