Encontró una situación cuando ThreadPoolExecutor
está estacionado en la función execute(Runnable)
mientras que todos los ThreadPool
hilos están esperando en getTask
func, workQueue is empty.Punto muerto en ThreadPoolExecutor
¿Alguien tiene alguna idea?
El ThreadPoolExecutor
se crea con ArrayBlockingQueue
, y corePoolSize == maximumPoolSize = 4
[Editar] Para ser más precisos, el hilo se bloquea en ThreadPoolExecutor.exec(Runnable command)
func. Tiene la tarea de ejecutar, pero no lo hace.
[Editar2] El ejecutor está bloqueado en algún lugar dentro de la cola de trabajo (ArrayBlockingQueue
).
[Edit3] La pila de llamadas:
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)
al mismo tiempo que el WorkQueue está vacía (comprobado mediante depuración remota)
[Edit4] Código trabajar con 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);
}
}
}
¿Cuál es la naturaleza de la tarea que se pasa a TPE.execute() func.? Si la tarea tiene acceso a TPE, este podría ser su problema. – artemv
Creo que tengo un problema comparable el 1.7.0_13.El proceso comienza y funciona sin problemas ... y luego en algún momento tengo ~~ 200 tareas pero mi cola de bloqueo está vacía. El tamaño del grupo principal es 3 ... Estoy usando ArrayBlockingQueue también ... – cljk