线程停在 java.util.concurrent.ThreadPoolExecutor.getTask 的原因可能是什么
What could be the reason for thread to be parked at java.util.concurrent.ThreadPoolExecutor.getTask
我有一个执行程序,负责使用来自 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
个时间单位。不过,在您的情况下不会发生这种情况,因为您将 maximumPoolSize
和 corePoolSize
设置为相同的数字 (1).
我不希望您的 ThreadPoolExecutor
与 Executors.newFixedThreadPool(1)
返回的行为有任何不同,除了您的 ThreadPoolExecutor
只能有一个未决任务,并且它给池线程一个特殊名称。
我有一个执行程序,负责使用来自 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
个时间单位。不过,在您的情况下不会发生这种情况,因为您将 maximumPoolSize
和 corePoolSize
设置为相同的数字 (1).
我不希望您的 ThreadPoolExecutor
与 Executors.newFixedThreadPool(1)
返回的行为有任何不同,除了您的 ThreadPoolExecutor
只能有一个未决任务,并且它给池线程一个特殊名称。