/ / RejectedExecutionException encadeamentos gratuitos, mas fila completa - java, multithreading, exception

RejectedExecutionException encadeamentos gratuitos, mas fila completa - java, multithreading, exception

O que está causando isso RejectedExecutionException?

[Running, pool size = 40, active threads = 3, queued tasks = 20, completed tasks = 180]

ThreadPoolExecutor:

new ThreadPoolExecutor(30, 40, 10, TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(20), threadFactory);

O tamanho do pool é 40 e apenas 3 threads estão ativos, então por que não está usando o resto deles?

Respostas:

0 para resposta № 1

Enciclopédia de RejectedExecutionException, mas fila completa

Esta é provavelmente uma condição de corrida. Em algum momento você adicionou mais de 60 tarefas ao pool. 40 estavam correndo em tópicos e foi para adicionar a tarefa 21 para o ArrayBlockingQueue e rejeitou isto. No entanto, quando você voltar para imprimir as estatísticas, os trabalhos terminaram, portanto, há apenas três threads em execução no momento.

Você pode adicionar um RejectedExecutionHandler manipulador que irá bloquear o produtor:

threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
// this will block the producer until there"s room in the queue
executor.getQueue().put(r);
} catch (InterruptedException e) {
throw new RejectedExecutionException(
"Unexpected InterruptedException", e);
}
}
});

0 para resposta № 2

Você não pode usar a contagem de threads ativa para depurar problemas como este. A documentação afirma que o número é apenas aproximado, e será obsoleto no momento em que você obter o RejectedExecutionException.