java 8 threadPoolExecutor 在 return 语句执行 N 个任务后卡住

java 8 threadPoolExecutor stucks after N tasks with return statement

我正在使用 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 语句的块被启用时,所有这些任务都会卡在 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任务。根据您的要求使用合理的值配置此队列大小。