RejectedExecutionException释放线程但完整队列

时间:2014-04-10 18:49:33

标签: java multithreading exception

导致此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个线程处于活动状态,那么为什么它不使用其余的呢?

2 个答案:

答案 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时,该数字将过时。