导致此RejectedExecutionException的原因是什么?
[Running, pool size = 40, active threads = 3, queued tasks = 20, completed tasks = 180]
的ThreadPoolExecutor:
new ThreadPoolExecutor(30, 40, 10, TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(20), threadFactory);
池大小为40且只有3个线程处于活动状态,那么为什么它不使用其余的呢?
答案 0 :(得分:1)
RejectedExecutionException免费线程但是完整队列
这可能是竞争条件。在某些时候,您已向池中添加了60多个任务。 40个在线程中运行,它将第21个任务添加到ArrayBlockingQueue
并拒绝它。但是,当您返回打印统计数据时,作业已经完成,因此此时只有3个正在运行的线程。
您可以添加一个阻止生产者的RejectedExecutionHandler
处理程序:
threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
// this will block the producer until there's room in the queue
executor.getQueue().put(r);
} catch (InterruptedException e) {
throw new RejectedExecutionException(
"Unexpected InterruptedException", e);
}
}
});
答案 1 :(得分:1)
您无法使用活动线程数来调试此类问题。 The documentation表示该数字仅为近似值,当您获得RejectedExecutionException
时,该数字将过时。