Cómo terminar este hilo
1. Utilice el indicador de salida para hacer que el hilo salga normalmente, es decir, cuando se completa el método en ejecución, el hilo termina.
2. Utilice el método de detención para finalizar el hilo a la fuerza (este método no se recomienda porque detener, al igual que suspender y reanudar, puede producir resultados impredecibles).
3. Utilice el método de interrupción para interrumpir el hilo.
1. Utilice el indicador de salida para finalizar el hilo.
Cuando el método de ejecución completa la ejecución, el hilo sale. Pero a veces el método de ejecución nunca termina. Por ejemplo, en un programa del lado del servidor que utiliza subprocesos para escuchar las solicitudes de los clientes u otras tareas que requieren bucles. En este caso, es común poner estas tareas en un bucle, como un bucle while. Si desea que el ciclo se ejecute para siempre, puede usar while (true) {......} para lograrlo. Sin embargo, la forma más sencilla de hacer que un bucle while salga bajo ciertas condiciones es establecer un indicador booleano y controlar si el bucle while sale estableciendo el indicador en verdadero o falso. A continuación se proporciona un ejemplo de cómo terminar un hilo usando el indicador de salida.
paquete capítulo2;
clase pública ThreadFlag extiende Thread
{
salida booleana volátil pública = false;
public void run()
{
mientras(!exit);
}
public static void main(String[] args) arroja una excepción
{
ThreadFlag thread = new ThreadFlag();
thread.start();
sleep(5000 ); // El hilo principal se retrasa durante 5 segundos
thread.exit = true; // Terminar el hilo del hilo
thread.join();
System. out .println("¡El hilo salió!") )
}
}
El indicador de salida se define en el código anterior. Cuando la salida es verdadera, while El bucle sale. El valor predeterminado de salida es falso. Al definir la salida, se utiliza la palabra clave Java volátil, cuyo propósito es salir sincrónicamente. Esta palabra clave se utiliza para la ejecución sincrónica, lo que significa que solo un subproceso puede modificar el valor de salida a la vez.
2. Utilice el método stop para finalizar un hilo.
Utilice el método stop para finalizar por la fuerza un hilo en ejecución o suspendido. Podemos usar el siguiente código para terminar un hilo:
thread.stop();
Aunque puedes usar el código anterior para terminar un hilo, usar el método stop puede ser peligroso , como Apagar repentinamente la computadora en lugar de seguir los procedimientos de apagado normales puede tener resultados impredecibles, por lo que no se recomienda finalizar los subprocesos.
3. Utilice el método de interrupción para finalizar el hilo.
Hay dos formas de utilizar el método de interrupción para finalizar el hilo:
(1) El hilo. está en un estado bloqueado, como usar el método de suspensión.
(2) Utilice while(!isInterrupted()) {......} para determinar si el hilo está interrumpido.
En el primer caso de utilizar el método de interrupción, el método de suspensión arrojará una excepción InterruptedException, mientras que en el segundo caso, el hilo saldrá directamente. El siguiente código demuestra el uso del método de interrupción en el primer caso.
paquete capítulo2;
clase pública ThreadInterrupt extiende Thread
{
public void run()
{
probar
{
Probar
{
sleep(50000); // retraso 50 segundos
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
}
public static void main(String[] args) arroja una excepción
{
Hilo hilo = new ThreadInterrupt();
thread.start();
System.out.println("Interrupt threadInterrupt()");
Hilo .start();
Thread.start();
Thread.start()println("¡Interrumpa el hilo presionando cualquier tecla dentro de 50 segundos!")
;System.in.read();
thread.interrupt();
thread.join();
System.out.println( "¡El hilo ha salido!") )
}
}
El código anterior se ejecuta de la siguiente manera:
Presione cualquier tecla dentro de 50 segundos ¡Interrumpe el hilo!
Interrupción del sueño
¡El hilo ha cerrado!
Después de llamar al método de interrupción, el método de suspensión generará una excepción y luego generará el mensaje de error: suspensión interrumpida.
Nota: Hay dos métodos en la clase de subproceso para determinar si el método de interrupción ha terminado el subproceso. Uno es el método estático interrumpido () y el otro es el método no estático isInterrupted (). La diferencia entre estos dos métodos es que interrumpido se usa para determinar si el hilo actual está interrumpido, mientras que isInterrupted se puede usar para determinar si. otros hilos se interrumpen. Por lo tanto, while (!isInterrupted()) también se puede reemplazar por while (!Thread.interrupted()) .