多线程java 8 threadPoolExecutor在N个任务后使用return语句阻塞
我使用的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
})
当启用这个带有return语句的block时,所有这些任务都会卡在TPE中。TPE说它已经完全加载,并且总是抛出RejectedExecutionException
异常
我不明白为什么会这样。例如,如果您有一个大小为10的池,并且您有100个任务,其中10个任务将匹配if section,您将不接受第101个任务,接下来的所有任务都将被拒绝。为什么?
# 1 楼答案
您没有正确配置ThreadPoolExecutor
使用给定的初始参数、默认线程工厂和被拒绝的执行处理程序创建新的ThreadPoolExecutor。使用Executors工厂方法之一而不是此通用构造函数可能更方便
参数:
corePoolSize
-池中要保留的线程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOutmaximumPoolSize
-池中允许的最大线程数keepAliveTime
-当线程数大于核心数时,这是多余空闲线程在终止前等待新任务的最长时间unit
-keepAliveTime参数的时间单位workQueue
-用于在任务执行之前保存任务的队列。此队列将仅包含execute方法提交的可运行任务我从未见过
workQueue
大小(10)小于maximumPoolSize
(50)的TPE。在当前配置中,由于队列大小为10(此时的队列大小),第11个工作任务将被拒绝增加你的
workQueue
大小以摆脱RejectedExecutionException
。50个线程可以轻松处理1000多个小型辅助任务。根据您的要求,使用合理的值配置此队列大小