El siguiente fragmento de código intenta completar esto.Agraciado cierre de hilos y ejecutor
El código se repite para siempre y comprueba si hay solicitudes pendientes para procesar. Si hay alguno, crea un nuevo hilo para procesar la solicitud y lo envía al ejecutor. Una vez que todos los hilos están listos, duerme durante 60 segundos y nuevamente verifica las solicitudes pendientes.
public static void main(String a[]){
//variables init code omitted
ExecutorService service = Executors.newFixedThreadPool(15);
ExecutorCompletionService<Long> comp = new ExecutorCompletionService<Long>(service);
while(true){
List<AppRequest> pending = service.findPendingRequests();
int noPending = pending.size();
if (noPending > 0) {
for (AppRequest req : pending) {
Callable<Long> worker = new RequestThread(something, req);
comp.submit(worker);
}
}
for (int i = 0; i < noPending; i++) {
try {
Future<Long> f = comp.take();
long name;
try {
name = f.get();
LOGGER.debug(name + " got completed");
} catch (ExecutionException e) {
LOGGER.error(e.toString());
}
} catch (InterruptedException e) {
LOGGER.error(e.toString());
}
}
TimeUnit.SECONDS.sleep(60);
}
}
Mi pregunta es que la mayor parte del procesamiento realizado por estos hilos se relaciona con la base de datos. Y este programa se ejecutará en una máquina de Windows. ¿Qué sucede con estos hilos cuando alguien intenta cerrar o cerrar sesión en la máquina? Cómo cerrar con gracia los hilos en ejecución y también el ejecutor.
Esto está al revés. Suponiendo que el 'ExecutorService' es uno de los valores típicos devueltos por los métodos de fábrica' Executors', los hilos de respaldo son hilos que no son daemon. El enganche de cierre no se invocará hasta que esos hilos salgan, y eso no sucederá hasta que se cierre el 'ExecutorService'. Su solución solo se producirá si los hilos del ejecutor no son daemon o si su programa recibe una interrupción de usuario. –
El OP pregunta específicamente sobre el caso en el que se le ha pedido a la JVM que realice un cierre ordenado. De todos modos, el contenido de la respuesta es preciso, uno no necesita hacer esto en un cierre para terminar el servicio del ejecutor antes. –
Gracias por responder tan rápido.Creo que me perdí esa parte de su pregunta. ¿Puedes agregar un tercer '***' para aclarar ese bit? –