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 importantes en memoria. Por eso quiero poder limitar la cantidad de tareas pendientes en un momento.
Si creo ThreadPoolExecutor así:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
Luego, los executor.submit(callable)
tiros RejectedExecutionException
cuando la cola se llena y todos los hilos ya están ocupados.
¿Qué puedo hacer para executor.submit(callable)
bloquear cuando la cola está llena y todos los subprocesos están ocupados?
EDITAR : Intenté esto :
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
Y de alguna manera logra el efecto que quiero lograr, pero de una manera poco elegante (básicamente, los subprocesos rechazados se ejecutan en el subproceso de llamada, por lo que esto bloquea el subproceso 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. Lea todas las respuestas y comentarios.