gpt4 book ai didi

java 8 threadPoolExecutor 在 N 任务后卡住并返回语句

转载 作者:搜寻专家 更新时间:2023-10-31 20:00:42 25 4
gpt4 key购买 nike

我正在使用 ThreadPoolExecutor,如下所示:

ThreadPoolExecutor pool = new ThreadPoolExecutor(cores, 50, 30L,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));

和:

pool.execute(()->{

//code goes here

if(some condition){
return;
}
//code goes here
})

当启用带有返回语句的 block 时,所有这些任务都会卡在 TPE 中。 TPE 表示已完全加载并始终抛出 RejectedExecutionExceptionexception

我不明白为什么会这样。例如,如果你有一个大小为 10 的池,并且你有 100 个任务,其中 10 个将匹配 if 部分,你不会接受第 101 个任务,所有接下来的任务都将被拒绝。为什么?

最佳答案

您没有正确配置您的 ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)

使用给定的初始参数和默认线程工厂以及拒绝的执行处理程序创建一个新的 ThreadPoolExecutor。使用 Executors 工厂方法之一而不是这个通用构造函数可能更方便。

参数:

corePoolSize - 保留在池中的线​​程数,即使它们处于空闲状态,除非设置了 allowCoreThreadTimeOut

maximumPoolSize - 池中允许的最大线程数

keepAliveTime - 当线程数大于核心数时,这是多余的空闲线程在终止前等待新任务的最长时间。

unit - keepAliveTime 参数的时间单位

workQueue - 用于在执行任务之前保留任务的队列。该队列将仅保存由 execute 方法提交的可运行任务。

我从未见过 workQueue 大小 (10) 小于 maximumPoolSize (50) 的 TPE。使用您当前的配置,由于队列大小为 10(当时的队列大小),第 11 个工作任务将被拒绝

增加您的 workQueue 大小以摆脱 RejectedExecutionException。 50个线程可以轻松处理1000多个小worker任务。根据您的要求使用合理的值配置此队列大小。

关于java 8 threadPoolExecutor 在 N 任务后卡住并返回语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36115636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com