2009-04-26 19 views
5

tengo el siguiente código en un Ejecutable que se pasa a un hilo t:java hilo de terminación temprana y sospechosamente

public void run() { 
     logger.debug("Starting thread " + Thread.currentThread()); 

     try { 
      doStuff(); 
     } catch (Exception e) { 
     logger.debug("Exception in Thread " + Thread.currentThread()); 
     } 

     logger.debug("End of thread " + Thread.currentThread()); 
    } 

He golpeado un error en el callejón sin salida que veo con las siguientes condiciones

  • sólo el comienzo de la secuencia de mensajes ha sido impreso por mis registros
  • Un volcado de hilo muestra que el hilo t (se supone que la ejecución de este) ya no se ejecuta

¿Existe alguna forma mágica de que este hilo haya terminado antes sin registrar un mensaje de fin de hilo O lanzar una excepción?

Respuesta

7

¿Estás seguro de que doStuff() no arrojó un Error? Cambie catch (Exception e) a catch (Throwable t). Es posible eliminar subprocesos en Java con Thread.stop(), pero eso es muy poco probable.

+0

muchas gracias. Resulta que el hilo era OOMing - y dado que no estaba detectando throwable (y tal vez otro registro estaba mal configurado?), No recibí ninguna notificación – Jacob

0

Claro, el hilo podría ser interrumpido después del final del bloque try/catch pero antes de la última declaración logger.debug. En ese caso arrojaría un InterruptedException que, en principio, podría no grabarse en ninguna parte (si el manejador de excepción predeterminado está configurado para ignorar tales cosas).

Parece un escenario bastante improbable, sin embargo ... es difícil saber qué está pasando sin saber más sobre el resto de su programa.

+0

Suponiendo E/S interrumpible en el registrador. –

1

¿Estás seguro de donde empezar () de rosca, que también se une a () después?

Runnable myRunnable=new Runnable(){ 
    @Override 
    public void run(){ 
    // your original code goes here 
    } 
}; 

Thread myThread=new Thread(myRunnable); 

myThread.start(); 

myThread.join(); // magic happens here! it waits for the thread to finish ;) 

Por cierto, join() puede producir una InterruptedException, así que si algo interrumpe el hilo mientras se está ejecutando, se unen le informará sobre esta lanzando esta excepción.

Espero que esto ayude.

1

Cuando se captura Exception, que presionen ningún RunnableException y cualquier declarados arrojados Exception, pero no se captura cualquier cosa que se extiende Error. Si realmente quiere capturar cualquier cosa, entonces necesita capturar Throwable.

Si quieres hacer esto para el registro únicamente fines y no se preocupan por qué las salidas de rosca, se puede hacer esto:

public void run() { 
    logger.debug("Starting thread " + Thread.currentThread()); 
    try { 
    // The work of your Thread 
    } finally { 
    logger.debug("End of thread " + Thread.currentThread()); 
    } 
} 

y la declaración finally está garantizado para ejecutar a menos que se detenga el hilo o interbloqueos o de alguna otra forma deja de ejecutarse sin una excepción.

En la mayoría de mis programas, instalo un UncaughtExceptionHandler para conocer todos los hilos que mueren inesperadamente. Ha sido una gran ayuda para rastrear fallas. Esto fue agregado al lenguaje a partir de Java 5.

0

Cuando alguna vez atrape una excepción general, le sugiero que inicie sesión para saber cuál fue la excepción y la causa. No hacerlo no te ayudará en absoluto.

Cuestiones relacionadas