Java: ExecutorService que bloqueia o envio após um certo tamanho de fila

Estou tentando codificar uma solução na qual um único thread produz tarefas intensivas de E / S que podem ser executadas em paralelo. Cada tarefa possui dados significativos na memória. Então, eu quero poder limitar o número de tarefas pendentes no momento.

Se eu criar ThreadPoolExecutor assim:

    ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>(maxQueue));

Então oexecutor.submit(callable) jogaRejectedExecutionException quando a fila ficar cheia e todos os segmentos já estiverem ocupados.

O que posso fazer para fazerexecutor.submit(callable) bloquear quando a fila estiver cheia e todos os segmentos estiverem ocupados?

EDITAR: Eu tenteiesta:

executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

E, de certa forma, alcança o efeito que eu quero alcançar, mas de maneira deselegante (basicamente segmentos rejeitados são executados no segmento de chamada, portanto, isso impede o segmento de enviar mais).

EDIT: (5 anos depois de fazer a pergunta)

Para quem lê esta pergunta e suas respostas, não tome a resposta aceita como uma solução correta. Por favor, leia todas as respostas e comentários.

questionAnswers(7)

yourAnswerToTheQuestion