动态线程池

7

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

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

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

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

我是否需要自己实现它?

1个回答

9
请查看以下API:ThreadPoolExecutor中的setCorePoolSize(int)。
public void setCorePoolSize(int corePoolSize)

设置核心线程数。这将覆盖构造函数中设置的任何值。
如果新值小于当前值,则在下次空闲时,多余的现有线程将被终止。
如果新值较大,则如果需要,将启动新线程来执行任何排队的任务。
初始化:
ExecutorService service = Executors.newFixedThreadPool(5); 

根据需要,使用以下 API 调整线程池大小。
((ThreadPoolExecutor)service).setCorePoolSize(newLimit);//newLimit is new size of the pool 

重要提示:
如果队列已满,并且线程数的新值大于或等于之前定义的maxPoolSize,则任务将被拒绝。
因此,请正确设置maxPoolSize和corePoolSize的值。

它对我不起作用。我正在使用Visual VM查看线程池大小,但它始终显示已设置的初始池大小。 - Innovation
发布一个新问题,附带代码以分析问题。 - Ravindra babu
在创建 newFixedThreadPool 后,您还需要设置 maxPoolSize()。如果您没有这样做,那么 maxPoolSize 的值将被设置为分配给 newFixedThreadPool 的值。之后,如果您想将 CorePoolSize 设置为比 newFixedThreadPool 更大的值,则不会采用新的池大小,因为在这种情况下,它将大于 maxPoolSize。 - Innovation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接