可调整的Threadpool和队列

时间:2017-01-25 02:21:42

标签: java multithreading threadpool

我计划创建可调整的队列大小的可调节线程池。我使用无界LinkedBlockingQueue与外部设置控制排队的消息数量。最初,我的corepoolsize和maxpoolsize是相同的。现在,如果我想在运行时更新我的​​线程池大小,我将corepoolsize和maxpoolsize通过一个公共设置设置为不同的值。我想知道你对这种方法的看法。

将maxpoolsize设置为Integer.MAX_VALUE,我可以调整corepoolsize,因为我的队列是无限制的吗?

使用带有CallerRunsPolicy的SynchronousQueue而不是带外部控制的LinkedBlockingQueue更好吗?

重要提示:我还想知道当我减少corethreadpool大小时会发生什么,正在进行的任务是否会在中间被放弃?

1 个答案:

答案 0 :(得分:0)

我几乎没有问题。 您正在寻找SynchronousQueue的原因是什么? SynchronousQueue没有任何容量,甚至1。 根据此处的文件 - how to modify ThreadPoolTaskExecutor at runtime through jmx

  

阻塞队列,其中每个插入操作必须等待另一个线程执行相应的删除操作,反之亦然。同步队列没有任何内部容量,甚至没有容量。

所以在我看来,我们不应该使用它,除非我们的用例驱使我们使用它。除非我们对您的用例有充分的了解,否则我将无法发表评论。

关于线程池,正如您所提到的,CachedThreadPool执行您需要的确切功能,核心池大小除外,因此您可能需要对其进行评估。并且减少corepoolsize并不会阻止正在进行的线程,除非基础任务结束。所以不必担心同样的问题。 how to modify ThreadPoolTaskExecutor at runtime through jmx