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

标签 java multithreading threadpool executorservice thread-dump

我有一个执行器,负责使用来自 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)

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

最佳答案

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


编辑:当队列为空时,可能会发生其他事情:ThreadPoolExecutor 可以发送一条毒丸消息,如果数量不足,该消息会导致池线程死亡工作人员的数量大于 corePoolSize 超过 keepAlive 时间单位。但在您的情况下不会发生这种情况,因为您将 maximumPoolSizecorePoolSize 设置为相同的数字 (1)。


我不希望您的 ThreadPoolExecutorExecutors.newFixedThreadPool(1) 返回的行为有任何不同,除了您的只能有一个待处理任务,它给池线程一个特殊的名字。

关于java - 线程停放在 java.util.concurrent.ThreadPoolExecutor.getTask 的原因可能是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37975659/

相关文章:

java - 坚持使用 sql/hql 查询组

java - 定时器事件是否同步?

c++ - thread::hardware_concurrency() 检查返回零值

java - 决定使用 Comparable 或 Comparator

java - Java中如何将字符、数字、符号的组合转换为字符串

java - 为什么要将实例变量分配给局部变量?

java - 如何使用多线程聚合两个 Web 服务?

java - 线程池不调整大小

具有已知池大小但未知工作人员的 Java- FixedThreadPool

java - 动画淡入淡出不起作用