Cómo terminar un hilo

1. Usa el método de parada para terminar el hilo

El método de detención del subproceso ha quedado obsoleto . La
detención detendrá directamente el subproceso sin importar en qué estado se encuentre el subproceso.
Si el subproceso tiene un bloqueo, el método de detención liberará el bloqueo directamente sin realizar ninguna operación posterior.
Por ejemplo, la operación después de adquirir el bloqueo es modificar el valor de a y luego el valor de b, y luego liberar el bloqueo. Si se detiene después de modificar el valor de a, se libera el bloqueo y no se modifica el valor de b. Es fácil causar problemas de inconsistencia de datos.

public class StopThread {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (true) {
                System.out.println("new thread go on");
                sleep(1);
            }
        });

        t.start();
        sleep(5);
        t.stop();
    }

    private static void sleep(int i) {
        try {
            Thread.sleep(i*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
复制代码

2. Pausar suspender y reanudar reanudar

También es un método abandonado. No se recomienda usarlo. Cuando un hilo tiene un bloqueo, si se suspende por suspensión, no liberará el bloqueo. Si se olvida de continuar, el bloqueo nunca se liberará, lo que provocará un interbloqueo.

public class StopThread {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (true) {
                System.out.println("new thread go on");
                sleep(1);
            }
        });

        t.start();
        sleep(5);
        t.suspend();
        sleep(5);
        t.resume();
    }

    private static void sleep(int i) {
        try {
            Thread.sleep(i*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
复制代码

3. hilo de extremos volátiles

Es difícil controlar el tiempo, y el ciclo while siguiente no puede determinar cuántas veces ejecutar. Si está bloqueado en un ciclo determinado, no puede detenerse hasta la próxima vez que se juzgue el estado.
Soluciones elegantes para escenarios específicos.

public class StopThread {
    private static volatile boolean running = true;
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            int i = 0;
            while (running) {
                i++;
                System.out.println("new thread go on:  "+i);
            }
        });
        t.start();
        sleep(1);
        running = false;
    }

    private static void sleep(int i) {
        try {
            Thread.sleep(i*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
复制代码

4. interrumpir termina el hilo

Más elegante, si el subproceso está en estado de suspensión y espera, puede ser controlado por interruptException para finalizar

public class StopThread {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (Thread.interrupted()) {
                //do something
            }
        });
        t.start();
        sleep(1);
        t.interrupt();
    }

    private static void sleep(int i) {
        try {
            Thread.sleep(i * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
复制代码

Supongo que te gusta

Origin juejin.im/post/7078341915791327240
Recomendado
Clasificación