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 表示它已完全加载并且总是抛出 RejectedExecutionException
exception
我不明白为什么会这样。例如,如果你有一个大小为 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任务。根据您的要求使用合理的值配置此队列大小。
我正在使用 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 表示它已完全加载并且总是抛出 RejectedExecutionException
exception
我不明白为什么会这样。例如,如果你有一个大小为 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任务。根据您的要求使用合理的值配置此队列大小。