gpt4 book ai didi

java - ThreadPoolExecutor 神秘地拒绝可运行对象

转载 作者:行者123 更新时间:2023-12-01 06:06:46 26 4
gpt4 key购买 nike

鉴于以下单元测试,有人可以向我解释为什么 ThreadPoolExecutor 在某些时候会拒绝任务吗?

 @Test
public void testRejectionBehavior() throws Exception {
final AtomicLong count = new AtomicLong(0);
final AtomicInteger activeThreads = new AtomicInteger(0);
for (;;) {
ThreadPoolExecutor pool = new ThreadPoolExecutor(20, 20,
0L, TimeUnit.MILLISECONDS,
new SynchronousQueue<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy());
int prestarted = pool.prestartAllCoreThreads();
pool.allowCoreThreadTimeOut(false);
System.out.println("Prestarted #" + prestarted);
for (int i = 0; i < 100; i++) {
final int thisTasksActive = activeThreads.incrementAndGet();
pool.execute(new Runnable() {
@Override
public void run() {
long value = count.incrementAndGet();
if (value % 50 == 0) {
System.out.println("Execution #" + value + " / active: " + thisTasksActive);
}
if (Thread.currentThread().getName().equals("main")) {
throw new IllegalStateException("Execution #" + value + " / active: " + thisTasksActive);
}
activeThreads.decrementAndGet();
}
});
Thread.sleep(5);
}
}
}

我的输出如下所示:

....
Execution #200 / active: 1
Prestarted #20

java.lang.IllegalStateException: Execution #201 / active: 1 / pool stats: java.util.concurrent.ThreadPoolExecutor@156643d4[Running, pool size = 20, active threads = 20, queued tasks = 0, completed tasks = 0]

正如您所看到的,它执行了大约 200 次,然后突然拒绝了新迭代的第一个任务。

最佳答案

好吧,经过大量深入研究 ThreadPoolExecutor事实证明,在创建 ThreadPoolExecutor 时使用给定的参数它不能立即执行任务。

即使您调用pool.prestartAllCoreThreads();,实际上也存在竞争条件。 。你看,prestartAllCoreThreads()创建新ThreadPoolExecutor.Worker实现 Runnable 的实例界面。实例化它们时,它们将内部状态设置为 -1,使它们在 toString() 中显示为“Activity 线程”。 ThreadPoolExecutor 的输出。现在也在其构造函数中,Worker 实例创建一个新线程并将自身设置为 Runnable对于这个线程。直到他们的run()方法实际上是由新启动的线程调用的,它们将其状态设置为可用于执行任务,然后调用 workQueue.take()方法。

简而言之,当您有 ThreadPoolExecutor使用同步队列并预启动所有线程,这些线程可能需要一段时间才能真正启动并在 queue.take() 中阻塞。状态。直到那时您才能提交任务并且不会被拒绝执行。

关于java - ThreadPoolExecutor 神秘地拒绝可运行对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42921760/

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