Обнаружена ситуация, когда ThreadPoolExecutor
припаркован в execute(Runnable)
функции, а все токи ThreadPool
ждут в getTask
func, workQueue пуст.Тупик в ThreadPoolExecutor
Есть ли у кого-нибудь идеи?
ThreadPoolExecutor
создается с ArrayBlockingQueue
и corePoolSize == maximumPoolSize = 4
[Редактировать] Чтобы быть более точным, то поток блокируется в ThreadPoolExecutor.exec(Runnable command)
FUNC. У этого есть задача выполнить, но не делает этого.
[Edit2] Исполнитель заблокирован где-то внутри рабочей очереди (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)
в то же время workQueue пусто (проверено с помощью удаленной отладки)
[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()? Если задача имеет доступ к TPE, это может быть вашей проблемой. – artemv
Я думаю, что это сопоставимая проблема на 1.7.0_13.Процесс начинается и работает без проблем ... и затем в какой-то момент у меня есть ~~ 200 задач, но моя очередь блокировки пуста. Размер основного пула - 3 ... Я также использую ArrayBlockingQueue .... – cljk