2009-07-28 21 views
11

Si invoco el método run() en un subproceso y el método run() arroja una excepción no detectada, ¿cuál sería el resultado?¿Qué sucede cuando un hilo arroja una excepción?

¿Quién capta esta excepción? ¿Lo atrapan?

+5

Para hacer esto más claro - no invoca run() - llama a start() en el subproceso para hacer que el código en el método run() se ejecute en un nuevo hilo. Invocar run() directamente solo hace que el método de ejecución se ejecute en el hilo actual. – Nate

Respuesta

8

Si hay un controlador de excepción instalado para ThreadGroup, la JVM le pasa la excepción. Si se trata de un subproceso AWT, puede instalar un controlador de eventos para excepciones no manejadas. De lo contrario, la JVM lo maneja.

Ejemplo de un grupo de hilos con un controlador personalizado y cómo usarlo:

public class MyThreadGroup extends ThreadGroup { 
    public MyThreadGroup() { 
     super("My Thread Group"); 
    } 
    public void uncaughtException(Thread t, Throwable ex) { 
     // Handle exception 
    } 
} 

Thread t = new Thread(new MyThreadGroup(), "My Thread") { ... }; 
t.start(); 

Ejemplo de uso de un controlador de excepciones AWT:

public class MyExceptionHandler { 
    public void handle(Throwable ex) { 
     // Handle exception 
    } 
    public void handle(Thread t, Throwable ex) { 
     // Handle exception 
    } 
} 

System.setProperty("sun.awt.exception.handler", MyExceptionHandler.class.getName()); 
+3

"De lo contrario, la JVM lo maneja". Para ser más precisos, el hilo que generó la excepción morirá silenciosamente. –

+0

@Stephen: en realidad, imprime la excepción a stderr. – Draemon

+0

¿De verdad? Debe ser específico de JVM, entonces ... porque me ha tropezado la ausencia de un stack-trace. –

1

Si usted ha presentado el Ejecutable a una ExecutorService puede capturar la excepción como envuelto dentro de un ExecutionException. (Muy recomendable simplemente llamando a run())

Cuestiones relacionadas