This question already has answers here:
Dynamic resizing of java.util.concurrent.ThreadPoolExecutor while it has waiting tasks
(5个答案)
3年前关闭。
假设有一个线程池在具有4个CPU的计算机中运行,并且我想对该线程池进行负载动态控制。当池中运行某些线程时,是否可以更改corePoolSize?即,当负载低时,最多允许2个线程同时运行,但是当负载高时,则允许4个线程。如果没有,是否有适当的解决方案?
(5个答案)
3年前关闭。
假设有一个线程池在具有4个CPU的计算机中运行,并且我想对该线程池进行负载动态控制。当池中运行某些线程时,是否可以更改corePoolSize?即,当负载低时,最多允许2个线程同时运行,但是当负载高时,则允许4个线程。如果没有,是否有适当的解决方案?
最佳答案
当池中运行某些线程时,是否可以更改corePoolSize?
当然。 corePoolSize
在volatile
中标记为ThreadPoolExecutor
,因此您可以随时根据计算机的负载调用tpe.setCorePoolSize(...)
。您甚至可以在池中生成作业以入睡,检查负载并调整核心池的大小。您当然想在核心大小上添加另一个线程来执行此操作。
即,当负载低时,最多允许2个线程同时运行,但是当负载高时,则允许4个线程。
这听起来不错,但是要注意,只有在您要发送到线程池的作业完全受CPU约束的情况下,这才有意义。任何IO(磁盘,网络等)都意味着减少并发性没有多大意义。
这就是说,尽管我已经编写了很多线程化的应用程序,但我从未感到必须这样做。
10-07 20:14