gpt4 book ai didi

java - RejectedExecutionException 释放线程但队列已满

转载 作者:行者123 更新时间:2023-11-30 03:56:43 24 4
gpt4 key购买 nike

是什么导致了此 RejectedExecutionException?

[Running, pool size = 40, active threads = 3, queued tasks = 20, completed tasks = 180]

线程池执行器:

new ThreadPoolExecutor(30, 40, 10, TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(20), threadFactory);

池大小为 40,只有 3 个线程处于 Activity 状态,那么为什么它不使用其余线程呢?

最佳答案

RejectedExecutionException free threads but full queue

这可能是一个竞争条件。在某个时刻,您已向池中添加了 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);
}
}
});

关于java - RejectedExecutionException 释放线程但队列已满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22996529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com