【问题标题】:Dynamically change corePoolSize of a ThreadPoolExecutor [duplicate]动态更改 ThreadPoolExecutor 的 corePoolSize [重复]
【发布时间】:2016-12-01 15:01:38
【问题描述】:

假设有一个线程池运行在具有 4 个 CPU 的机器上,我想对该池进行负载动态控制。当池中有一些线程在运行时,是否可以更改 corePoolSize?即负载低时,最多允许2个线程同时运行,而负载高时,则允许4个线程同时运行。如果没有,是否有合适的解决方案?

【问题讨论】:

  • “大多数情况下,核心和最大池大小仅在构造时设置,但也可以使用 setCorePoolSize(int) 和 setMaximumPoolSize(int) 动态更改。”来自docs.oracle.com/javase/8/docs/api/java/util/concurrent/…
  • 您打算如何检测高/低负载?
  • Re,“如果没有,有合适的解决方案吗?”如果遇到最坏的情况,没有什么能阻止您实现自己的线程池。
  • 非常感谢您的评论。

标签: java multithreading threadpool java.util.concurrent threadpoolexecutor


【解决方案1】:

当池中有一些线程在运行时,是否可以更改 corePoolSize?

当然。 corePoolSizeThreadPoolExecutor 中标记为volatile,因此您可以随时根据您机器的负载调用tpe.setCorePoolSize(...)。您甚至可以在池中生成作业以休眠、检查负载并调整核心池大小。当然,您需要在核心大小上添加另一个线程来执行此操作。

即负载低时最多允许2个线程同时运行,而负载高时则允许4个线程。

这听起来不错,但重要的是要注意,唯一真正有意义的情况是您发送到线程池的作业是否完全受 CPU 限制。任何 IO(磁盘、网络等)都意味着降低并发性没有多大意义。

这就是说,尽管我编写了大量线程应用程序,但我从未觉得我必须这样做。

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 2011-03-28
    • 2020-09-15
    • 2015-06-12
    • 1970-01-01
    • 2011-11-22
    • 2016-07-18
    • 2013-06-15
    • 2014-03-29
    相关资源
    最近更新 更多