遇到ThreadPoolExecutor
停在execute(Runnable)
函数中的情况,而所有ThreadPool
线程正在等待getTask
func,workQueue为空。ThreadPoolExecutor中的死锁
有没有人有任何想法?
ThreadPoolExecutor
的与ArrayBlockingQueue
创建,并且corePoolSize == maximumPoolSize = 4
[编辑]为了更加精确,线程被阻塞在ThreadPoolExecutor.exec(Runnable command)
FUNC。它有执行的任务,但不这样做。
[编辑2]执行程序被阻塞在工作队列中的某处(ArrayBlockingQueue
)。
[EDIT3]调用堆栈:
thread = front_end(224)
at sun.misc.Unsafe.park(Native methord)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:747)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:778)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1114)
at
java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
at java.util.concurrent.ArrayBlockingQueue.offer(ArrayBlockingQueue.java:224)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:653)
at net.listenThread.WorkersPool.execute(WorkersPool.java:45)
在同一时间工作队列是空的(选中使用远程调试)
[Edit4]代码与ThreadPoolExecutor
工作:
public WorkersPool(int size) {
pool = new ThreadPoolExecutor(size, size, IDLE_WORKER_THREAD_TIMEOUT, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(WORK_QUEUE_CAPACITY),
new ThreadFactory() {
@NotNull
private final AtomicInteger threadsCount = new AtomicInteger(0);
@NotNull
public Thread newThread(@NotNull Runnable r) {
final Thread thread = new Thread(r);
thread.setName("net_worker_" + threadsCount.incrementAndGet());
return thread;
}
},
new RejectedExecutionHandler() {
public void rejectedExecution(@Nullable Runnable r, @Nullable ThreadPoolExecutor executor) {
Verify.warning("new task " + r + " is discarded");
}
});
}
public void execute(@NotNull Runnable task) {
pool.execute(task);
}
public void stopWorkers() throws WorkersTerminationFailedException {
pool.shutdownNow();
try {
pool.awaitTermination(THREAD_TERMINATION_WAIT_TIME, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw new WorkersTerminationFailedException("Workers-pool termination failed", e);
}
}
}
什么任务的性质传递给TPE.execute()FUNC。?如果任务可以访问TPE,那么这可能是您的问题。 – artemv 2010-03-12 12:09:50
我觉得我在1.7.0_13上有类似的问题。这个过程开始并且没有问题......然后在某些时候我有200个任务,但是我的阻塞队列是空的。核心池的大小是3 ...我也使用ArrayBlockingQueue .... – cljk 2013-09-19 12:45:32