Cómo gracia abortar el hilo?

Este artículo para aprender a aprender a abortar con elegancia el hilo? Por enfermedad y la muerte de Java hilos de estudio, creo que tenemos una cierta comprensión de hilos en ejecución, así como el estado de la rosca, a continuación, nos enteramos ahora abortar hilos:

Mal abortar hilo - parada

En primer lugar, vamos a explicar una manera incorrecta de terminar un hilo - stop: abortar el hilo y claras cerraduras monitor de información, pero puede conducir a enhebrar-cuestiones de seguridad, JDK no se recomienda utilizar un enfoque similar también Destory, JDK nunca se materializó debido al método, en el que no se presenta aquí.

Seguido de un programa para explicar por qué el stopplomo para enhebrar los problemas de seguridad?

En primer lugar definir una clase de hilo StopThread:

public class StopThread extends Thread {
    private int i = 0;
    private int j = 0;

    @Override
    public void run() {
        synchronized (this) {
            // 增加同步锁,确保线程安全
            ++i;
            try {
                // 休眠10秒,模拟耗时操作
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            ++j;
        }
    }

    /**
     * 打印 i 和 j
     */
    public void print() {
        System.out.println("i=" + i + " j=" + j);
    }
}

Este hilo que hacer es bloque de código de sincronización iy jestas dos variables operador de incremento, pero en este procedimiento de ejecución, los 10 segundos de sueño, si en el proceso, si stopel hilo se suspende método, entonces, Will conducir iy jdatos son incorrectos, se puede decir cuestiones de hilo de seguridad en la programación, ya que el hilo principal afecta a la creación de StopThreaddatos de hilos incorrección, salida correcta ideal debe ser de todos Agregar éxito o fracasan, porque añadimos el propósito es asegurar el funcionamiento de la cerradura atómica o quiere que estas dos variables sin la interferencia de otros hilos cuando está en funcionamiento.

Escribir la siguiente StopThreadDemoclase para utilizar el stopmétodo a ser una demostración de error:

public class StopThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        StopThread thread = new StopThread();
        thread.start();
        // 休眠 1 秒,确保 i 变量自增成功
        Thread.sleep(1000);
        // 暂停线程
        thread.stop(); // 错误的终止
        while (thread.isAlive()) {
            // 确保线程已经终止
        } // 输出结果
        thread.print();
    }
}

En la StopThreadDemoclase, crear e iniciar un StopThreadhilo, que se encuentra bajo las variables de ejecución iy jel operador de incremento, pero la operación de incremento se sincroniza bloque sincronizado parcela de palabras clave de hacerlo es hacer operador de incremento de dos variables lograr atomicidad , sin interferencia de otros hilos para garantizar la seguridad de la rosca.

Sin embargo, dentro de 10 segundos hilo a dormir por el stopmétodo de la rosca de aborto apagado, se encuentra el resultado de salida i=1 j=0, es decir, la primera mitad del incremento código i implementado, pero después de la mitad del mínimo de la falla j, los datos se enrosque aparece inconsistencia, de este modo para asegurar el bloque de código de sincronización del objetivo no se alcanza átomos, socavan el hilo de seguridad.

El hilo correcto abortar - interrupción

En la introducción a suspender el camino equivocado, vamos a aprender la secuencia correcta de aborto - interrupt:

Si el subproceso de destino llama Object classel wait() 、wait(long) 或 wait(long,int) 方法、join()、join(long,int) 或 sleep(long,int)método de obstrucción, a continuación, interruptse lleva a efecto, el estado de interrupción del hilo se borrará, lanza InterruptedExceptionuna excepción.

Si el subproceso de destino está bloqueado por IO o NIO en el canal, la misma operación IO será valores atípicos especiales de retorno interrumpidas, el propósito de la rosca suspensión.

Si no se cumplen las condiciones anteriores, el estado de interrupción, se creará este hilo.

A continuación StopThreadDemose stopcambió a interruptvistazo a lo que los resultados de operación son:

java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.wupx.thread.StopThread.run(StopThread.java:18)
i=1 j=1

Se puede encontrar Valor mínimo dos variables se pueden realizar adecuadamente para garantizar la coherencia de datos de la ejecución, interruptno se ve obligado a abortar, hilos de interrupción directamente, sino que se produce una excepción informarnos, los desarrolladores pueden controlar la lógica de ejecución de recibo anormal , de manera que todo el programa es el estado seguro para subprocesos, que es la versión actual del JDK recomienda interruptmétodo.

Además de interruptfuera de la manera correcta, también puede abortar un hilo en forma de banderas:

La interrupción del hilo correcta - Bandera

Si la lógica de programa de código se ejecuta en un servicios de bucle, puede aumentar la ejecución roscada programa de código una bandera, tal como el código siguiente en el whilebucle para ejecutar este programa, por flagsi continuar para controlar el programa, si la rosca externa flagmodificar el falsecódigo sub-roscado que creó el cambio recibirá estos datos, en la forma de esta variable, la notificación a otro hilo, el hilo de control con el fin de lograr el efecto de la suspensión.

public class FlagThreadDemo {
    public volatile static boolean flag = true;

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            try {
                while (flag) { // 判断是否运行
                    System.out.println("运行中");
                    Thread.sleep(1000L);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        // 3 秒之后,将状态标志改为 false,代表不继续运行
        Thread.sleep(3000L);
        flag = false;
        System.out.println("程序运行结束");
    }
}

Mediante la ejecución del código, los resultados son los siguientes:

运行中
运行中
运行中
程序运行结束

De esta manera se limita a la rosca lógica de negocio ejecutado, si el programa es la bandera condicional puede ser utilizado para hacer de esta manera, entonces se puede hacer, pero también es una manera de suspender el hilo correcto.

resumen

Este artículo explica tres formas de terminación de subprocesos: stop, interruptasí como la bandera, lo conseguimos, la bienvenida para discutir el mensaje.

El código fuente en el No. pública [ Wupei Xuan respuesta] en [ concurrente adquisición].

Supongo que te gusta

Origin www.cnblogs.com/wupeixuan/p/12578851.html
Recomendado
Clasificación