【问题标题】:Dynamic Thread Pool动态线程池
【发布时间】:2015-12-08 05:28:26
【问题描述】:

我有一个长时间运行的进程来监听事件并进行一些密集处理。

目前我使用Executors.newFixedThreadPool(x) 来限制并发运行的作业数量,但根据一天中的时间和其他各种因素,我希望能够动态增加或减少并发线程的数量。

如果我减少并发线程的数量,我希望当前正在运行的作业能够顺利完成。

是否有一个 Java 库可以让我控制和动态增加或减少线程池中运行的并发线程数? (该类必须实现 ExecutorService)。

我必须自己实现吗?

【问题讨论】:

    标签: java multithreading threadpool executorservice threadpoolexecutor


    【解决方案1】:

    看看ThreadPoolExecutor下面的API

    public void setCorePoolSize(int corePoolSize)
    

    设置核心线程数。这会覆盖构造函数中设置的任何值。

    如果新值小于当前值,多余的现有线程将在下次空闲时终止。

    如果更大,将在需要时启动新线程以执行任何排队的任务。

    初始化:

    ExecutorService service = Executors.newFixedThreadPool(5); 
    

    根据需要,调整线程池的大小使用下面的 API

    ((ThreadPoolExecutor)service).setCorePoolSize(newLimit);//newLimit is new size of the pool 
    

    重要提示:

    如果队列已满,并且线程数的新值大于或等于前面定义的 maxPoolSize,则 Task 将被拒绝。

    所以正确设置maxPoolSize和corePoolSize的值。

    【讨论】:

    • 它对我不起作用。我正在使用可视化 vm 查看线程池大小,它始终显示已设置的初始池大小。
    • 发布一个带有代码的新问题来分析问题。
    • 您还需要在创建 newFixedThreadPool 之后设置 maxPoolSize()。如果您没有这样做,那么在这种情况下,maxPoolSize 值将设置为分配给 newFixedThreadPool 的值,如果您想将其设置为之后,则设置为比 newFixedThreadPool 更大的东西,那么它不会采用新的池大小,因为在这种情况下,它将大于 maxPoolSize。
    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 2012-08-06
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2011-12-16
    相关资源
    最近更新 更多