Java: ExecutorService que bloquea el envío después de un determinado tamaño de cola

Estoy tratando de codificar una solución en la que un solo subproceso produce tareas intensivas de E / S que se pueden realizar en paralelo. Cada tarea tiene datos significativos en memoria. Así que quiero poder limitar el número de tareas que están pendientes en un momento.

Si creo ThreadPoolExecutor así:

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

Entonces laexecutor.submit(callable)&nbsp;tirosRejectedExecutionException&nbsp;cuando la cola se llena y todos los hilos ya están ocupados.

¿Qué puedo hacer para hacerexecutor.submit(callable)&nbsp;bloquear cuando la cola está llena y todos los hilos están ocupados?

EDITAR: Lo intentéesta:

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

Y de alguna manera logra el efecto que quiero lograr pero de una manera poco elegante (básicamente los hilos rechazados se ejecutan en el hilo de llamada, por lo que esto bloquea el hilo de llamada para que no envíe más).

EDITAR: (5 años después de hacer la pregunta)

Para cualquiera que lea esta pregunta y sus respuestas, no tome la respuesta aceptada como una solución correcta. Por favor lea todas las respuestas y comentarios.