Estoy tratando de usar la clase ThreadPoolExecutor
de Java para ejecutar una gran cantidad de tareas pesadas con un número fijo de hilos. Cada una de las tareas tiene muchos lugares durante los cuales puede fallar debido a excepciones.Manejando excepciones de tareas de Java ExecutorService
He subclasificado ThreadPoolExecutor
y he reemplazado el método afterExecute
que se supone que proporciona las excepciones no detectadas encontradas al ejecutar una tarea. Sin embargo, parece que no puedo hacer que funcione.
Por ejemplo:
public class ThreadPoolErrors extends ThreadPoolExecutor {
public ThreadPoolErrors() {
super( 1, // core threads
1, // max threads
1, // timeout
TimeUnit.MINUTES, // timeout units
new LinkedBlockingQueue<Runnable>() // work queue
);
}
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if(t != null) {
System.out.println("Got an error: " + t);
} else {
System.out.println("Everything's fine--situation normal!");
}
}
public static void main(String [] args) {
ThreadPoolErrors threadPool = new ThreadPoolErrors();
threadPool.submit(
new Runnable() {
public void run() {
throw new RuntimeException("Ouch! Got an error.");
}
}
);
threadPool.shutdown();
}
}
La salida de este programa es "Todo está bien - situación normal!" aunque el único Runnable enviado al grupo de subprocesos arroja una excepción. ¿Alguna pista de lo que está pasando aquí?
Gracias!
Gracias, terminé usando esta solución. Además, en caso de que alguien esté interesado: otros han sugerido no subclasificar el ExecutorService, pero lo hice de todos modos porque quería supervisar las tareas mientras finalizaban en lugar de esperar que todas terminaran y luego llamar a get() en todas las Futuros devueltos. – Tom
Otro enfoque para crear subclases del ejecutor es subclase FutureTask y anular su método 'hecho' – nos
Tom >> ¿Puede publicar el código de fragmento de muestra donde ha subclase ExecutorService para supervisar las tareas mientras completan ... – jagamot