线程停放在 java.util.concurrent.ThreadPoolExecutor.getTask 的原因可能是什么

问题描述 投票:0回答:2

我有一个执行器,负责消费来自 ArrayBlockingQueue 的消息。

new ThreadPoolExecutor(1, 1, 0L,
                TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(1),  
                r -> {
                    return new Thread(r, "Request-Queue-Drainer");
                });

Request-Queue-Drainer 线程处于 WAITING 状态(尽管任务正在提交给该线程)。以下是线程转储。

Name: Request-Queue-Drainer
State: WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@5b4757a2
Total blocked: 0  Total waited: 8

Stack trace: 
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)

线程处于等待状态的原因可能是什么?

java multithreading threadpool executorservice thread-dump
2个回答
4
投票

线程正在等待,因为队列为空。这就是池线程所做的:它们从队列中选择任务并运行它们,当队列为空时,它们会等待。


编辑:当队列为空时,可能发生其他事情:如果工作线程数量大于

ThreadPoolExecutor
更多,则
corePoolSize
可以发送毒丸消息,导致池线程死亡比
keepAlive
时间单位。但在您的情况下不会发生这种情况,因为您将
maximumPoolSize
corePoolSize
设置为相同的数字 (1)。


我不希望您的

ThreadPoolExecutor
的行为与
Executors.newFixedThreadPool(1)
返回的行为有任何不同,除了您的任务只能有一个待处理任务,并且它为池线程提供了一个特殊的名称。


0
投票

java.lang.错误:X.1L9 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1173) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 com.facebook.redex.RunnableRunnableShape17S0200000_15.run(来源未知:3124) 在 java.lang.Thread.run(Thread.java:764) 造成者:X.1L9 在 X.2MV.A00(来源不明:159) 在 com.facebook.redex.RunnableRunnableShape0S1301000.run(来源未知:24) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) ...还有3个

© www.soinside.com 2019 - 2024. All rights reserved.