2009-11-05 20 views
8

Estoy llamando a dos hilos de un hilo principal, llámalos hilo 1 e hilo 2. Cuando hilo 1 se detiene, quiero detener o matar el hilo 2 también. ¿Cómo puedo hacer esto? Hay un cambio en la producción real de lo que quiero. Es decir, hay una clase principal que también es thread.From clase principal estoy llamando thread1 y thread2. Estoy dando una entrada a thread1 desde la clase principal pero cuando esta entrada se está cambiando, quiero matar el hilo en ejecución1 y comenzarlo de nuevo con otra entrada. El segundo hilo, thread2 se ejecutará con la salida dada por el hilo1.Así que, cuando el primer hilo muera, el segundo se ejecutará pero dará un resultado solo si hay una entrada para ese hilo.¿Cómo puedo matar un hilo de otro hilo en Java?

Respuesta

13

Java ha desaprobado métodos para matar explícitamente otro hilo (como Thread.stop/Thread.destroy). La forma correcta es asegurarse de que las operaciones en el otro subproceso puedan soportar que se les diga que se detengan (por ejemplo, esperan una InterruptedException, lo que significa que puede llamar a Thread.interrupt() para detenerla).

Puede que también esté interesado en configurar el segundo hilo como daemon thread, lo que significa que en caso de que todos los otros hilos en la máquina virtual hayan finalizado, el proceso finalizará.

2

Según these instructions, lo mejor es utilizar variables bandera para decirle al otro hilo para detener su trabajo limpiamente.

+0

Muchas gracias por la sugerencia, pero puede ayudarme a especificarla correctamente. – Raji

6

Ver this Java Specialist article sobre la manera de apagar hilos limpiamente.

En pocas palabras, el artículo recomienda Thread.interrupt() más el manejo apropiado de InterruptedException en el código de la secuencia. Esa es una discusión interesante en sí misma, y ​​es algo que rara vez veo hecho correctamente.

+1

Ese artículo es una gran lectura y recomendable para cualquiera que no tenga tiempo suficiente para leer Programación Concurrente de Doug Lea en Java – abyx

1

En el método run() de su hilo, marque un atributo que se establece a través de un método de acceso como shutdown() cuando desea detener el hilo, use ese valor para finalizar el ciclo while. Por ejemplo:

boolean stopping = false; 

Thread currentThread = null; 

public void run() { 

    currentThread = Thread.currentThread(); 

    while (!isStopping()) { 

     // do something, sleep a while 
    } 
} 

public synchronized void shutdown() { 

    stopping = true; 

    currentThread.notifyAll(); 
} 

public synchronized boolean isStopping() { 

    return stopping; 
} 
+0

el código tiene una condición de carrera y su uso de la sincronización es pobre. Es mucho mejor simplemente verificar el estado interrumpido del hilo actual o si DEBES utilizar algún tipo de centinela, al menos hacerlo atómico. – Kevin

+0

@Kevin, debe haber perdido el * Por ejemplo * bit, este código, obviamente, solo pretende mostrar la estructura de una solución, no para ser utilizado tal como está. – rsp

+1

@rsp: si publica ejemplos, preferiblemente hágales buenos ejemplos. Si las personas ya supieran distinguir los ejemplos buenos de los malos, no tendrían que preguntar aquí. –

Cuestiones relacionadas