2009-03-05 29 views
6

¿Cómo puedo volver al hilo principal desde un hilo diferente cuando hay una excepción? Cuando se produce una excepción en un subproceso secundario, deseo que se envíe una notificación al subproceso principal y ejecute un método del subproceso principal. ¿Cómo puedo hacer esto?Java: ¿volver a cambiar al hilo principal?

Gracias.

Información adicional

Estoy llamando a un método de mi método principal y comenzar un nuevo hilo allí después de algunos cálculos y cambios

Thread thread = new Thread() { 
    @Override 
    public void run() { 
     ..... 
    } 
} 
thread.start(); 

Respuesta

3

Cuando ocurre la excepción en el subproceso secundario, ¿cuál es el hilo principal que va a hacer? Tendrá que ser esperando por cualquier error en un hilo hijo.

Puede establecer un UncaughtExceptionHandler en la cadena secundaria, lo que puede provocar un evento que el subproceso principal está esperando.

+0

No tiene que estar esperando. Podría sondear periódicamente una cola para un evento de error, moviéndose a otras tareas si no hay eventos que manejar. – erickson

+0

@eickson, sí, no necesita estar esperando todo el tiempo, pero tendrá que esperar en algún momento. Quería asegurarme de que el OP entendía que esto tendría que ser una espera/notificación, que Thread.start no devuelve un valor que pueda ser utilizado por la persona que llama. –

+0

Este método (y mi método) en realidad no se ejecuta en el hilo principal, todavía se realizan con Thread.currentThread == el hilo donde se produce la excepción. No estoy seguro de si eso realmente importa para el OP. – TofuBeer

1

Si el hilo hijo fue creado en el principal, podría dejar la excepción emergente y manejarla en el hilo principal.

También puede devolverle una especie de llamada.

No he probado esto por mi cuenta.

-2

Este podría trabajar para usted.

public class Main 
{ 
    public static void main(final String[] argv) 
    { 
     final Main main; 

     main = new Main(); 
     main.go(); 
    } 

    public void go() 
    { 
     final Runnable runner; 
     final Thread thread; 

     runner = new Foo(this); 
     thread = new Thread(runner); 
     thread.start(); 
    } 

    public void callback() 
    { 
     System.out.println("hi!"); 
    } 
} 

class Foo 
    implements Runnable 
{ 
    private final Main main; 

    Foo(final Main m) 
    { 
     main = m; 
    } 

    public void run() 
    { 
     // try catch and handle the exception - the callback is how you notify main 
     main.callback(); 
    } 
} 
+1

Completamente toro. Clases! = Hilos. No notificas ningún otro hilo en tu código. – Bombe

+0

Correcto, y le hice la pregunta de más contexto (pero nunca obtuve una respuesta utilizable). El código anterior le permite notificar a Main que algo salió mal. Tenga en cuenta que dije que _might_ trabajo para él_ no puedo decirlo con certeza ya que lo que él quiere no es posible (AFAIK) – TofuBeer

+0

La pregunta indica claramente el deseo de llamar algo al hilo principal ... no a la clase "principal". Este ejemplo de código no logra eso. – Jason

3

Como dice TofuBeer es necesario proporcionar más contexto, sin embargo, si ese contexto es que usted es una aplicación de oscilación ...

SwingUtilities.invokeLater (r Ejecutable) le permite llamar de nuevo en Swing hilo de ejecución principal.

} catch (final Exception e) { 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run() { 
      //do whatever you want with the exception 
     } 
    }); 
} 
+0

Sí, la forma en que realiza la devolución de llamada depende en gran medida de la forma en que se ejecuta el programa. – TofuBeer

0

implementar la interfaz http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.UncaughtExceptionHandler.html de alguna clase de su aplicación, y dejar que el manejo del hilo y la excepción que generó.

Consulte el documento para obtener más detalles.

EDITAR: Esto probablemente no es lo que quería, creo que el método va a ser llamado por el hilo que acaba de lanzar la excepción. Si desea que se ejecute algún método en su hilo principal (en su contexto), el hilo principal tendrá que estar esperándolo de alguna manera.

Pero si solo desea manejar la excepción, es un caso. El mejor enfoque, pensó, sería manejar la excepción en un intento ... atrapar un bloque dentro de tu hilo.

Cuestiones relacionadas