tengo esta pregunta bastante simple sobre el ThreadPoolExecutor. Tengo la siguiente situación: debo consumir objetos de una cola, crear las tareas apropiadas para ellos y enviarlos al ThreadPoolExecutor. Esto es bastante simple. Pero dentro de un escenario de cierre muchos trabajadores pueden ser puestos en cola para la ejecución. Dado que una de esas tareas puede estar ejecutándose durante una hora, y quiero un apagado relativamente rápido y elegante de la aplicación, quiero descartar todas las tareas en cola del ThreadPoolExecutor mientras que las tareas que ya están en proceso deben completarse normalmente.Eliminando todas las tareas en cola de un ThreadPoolExecutor
La documentación del ThreadPoolExecutor tiene un método remove() pero solo permite eliminar tareas específicas. purge() solo funciona para tareas Future ya canceladas. Mi idea era borrar la cola que contenía todas las tareas en cola. El ThreadPoolExecutor proporciona acceso a esta cola interna, pero la documentación indica:
Método getQueue() permite el acceso a la cola de obra para fines de monitoreo y depuración. El uso de este método para cualquier otro propósito es fuertemente desaconsejado.
Así que agarrar esta cola y borrarla no es una opción. Además, este fragmento de la documentación dice:
métodosdos pilas, remove (java.lang.Runnable) y de purga() están disponibles para ayudar en la recuperación de almacenamiento cuando un gran número de tareas se vuelven cola cancelado .
¿Cómo? Claro, puedo mantener una lista de todas las tareas que envié al ejecutor y, en caso de cierre, repito todas las entradas y las elimino del ThreadPoolExecutor con el método remove() ... pero ... vamos, este es un pérdida de memoria y una molestia para mantener esta lista. (Eliminando tareas ya ejecutadas, por ejemplo)
¡Agradezco cualquier sugerencia o solución!
Este podría ser el enfoque más limpio, por lo tanto, acepto esta respuesta. :-) Incluso esperaba que ya haya algo así ... así que: codifiquemos esto. :-) – Malax