具有无限队列的ThreadPoolExecutor不创建新线程

具有无限队列的ThreadPoolExecutor不创建新线程,第1张

具有无限队列的ThreadPoolExecutor不创建新线程

此博客文章介绍了这一难题:

这种线程池的构造根本无法按预期工作。这是由于ThreadPoolExecutor中的逻辑所致,如果 无法
向队列提供任务,则会在其中添加新线程。在我们的例子中,我们使用无限制的linkedBlockingQueue,在这里我们总是可以向队列提供任务。这实际上意味着我们永远不会超过核心池大小,而不会增长到最大池大小。

如果还需要将最小池大小与最大池大小解耦,则必须进行一些扩展编码。我不知道Java库或Apache
Commons中存在的解决方案。解决方案是创建一个

BlockingQueue
知道TPE
的耦合,如果知道TPE没有可用的线程,它将竭尽全力拒绝任务,然后手动重新排队。在链接的文章中有更详细的介绍。最终,您的构造将如下所示:

public static ExecutorService newScalingThreadPool(int min, int max, long keepAliveTime) {   ScalingQueue queue = new ScalingQueue();   ThreadPoolExecutor executor =      new ScalingThreadPoolExecutor(min, max, keepAliveTime, TimeUnit.MILLISECONDS, queue);   executor.setRejectedExecutionHandler(new ForceQueuePolicy());   queue.setThreadPoolExecutor(executor);   return executor;}

但是更简单地设置

corePoolSize
maxPoolSize
,不用担心这种废话。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5490098.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存