Parece ser impossível criar um pool de threads em cache com um limite para o número de threads que ele pode criar.
Aqui está como Executors.newCachedThreadPool estático é implementado na biblioteca Java padrão:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
Portanto, usando esse modelo para criar um pool de encadeamentos em cache de tamanho fixo:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Agora, se você usar isso e enviar três tarefas, tudo ficará bem. O envio de outras tarefas resultará em exceções de execução rejeitadas.
Tentando isso:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
Resultará na execução seqüencial de todos os threads. Ou seja, o pool de threads nunca criará mais de um thread para lidar com suas tarefas.
Este é um erro no método de execução do ThreadPoolExecutor? Ou talvez isso seja intencional? Ou existe alguma outra maneira?
Editar: eu quero algo exatamente como o pool de threads em cache (ele cria threads sob demanda e os mata após algum tempo limite), mas com um limite no número de threads que ele pode criar e a capacidade de continuar na fila de tarefas adicionais depois atingiu seu limite de threads. De acordo com a resposta de sjlee, isso é impossível. Olhando para o método execute () do ThreadPoolExecutor, é realmente impossível. Eu precisaria subclassificar ThreadPoolExecutor e substituir execute () da mesma forma que o SwingWorker, mas o que o SwingWorker faz em seu execute () é um hack completo.