【发布时间】:2016-06-22 18:25:26
【问题描述】:
我有一个执行器,它负责使用来自 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。您将明确的ThreadFactory传递给它,但您的ThreadFactory与默认线程工厂的唯一不同之处在于它为每个新线程提供了一个特殊的名称。
标签: java multithreading threadpool executorservice thread-dump