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

ThreadPoolExecutor无法创建新线程。实际上,我编写了一个有点黑的程序LinkedBlockingQueue,可以接受任何任务(即,它是不受限制的),但是调用了一个附加处理程序-

在我的应用程序中,它会发出警告跟踪表明该池已落后-这为我提供了TPE拒绝创建的非常明确的信息新队列,即使队列中有成千上万的条目。我的构造函数如下:

private final ExecutorService s3UploadPool = 

new ThreadPoolExecutor(1, 40, 1, TimeUnit.HOURS, unboundedLoggingQueue);

为什么不创建新线程?

回答:

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

这种线程池的构造根本无法按预期工作。这是由于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;

}

但是更简单地设置corePoolSizemaxPoolSize,不用担心这种废话。

以上是 具有无限队列的ThreadPoolExecutor不创建新线程 的全部内容, 来源链接: utcz.com/qa/400904.html

回到顶部