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(磁盘,网络等)都意味着降低并发性没有多大意义。

这就是说,我从来没有觉得我必须这样做,尽管我已经写了大量的线程应用程序。