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 stop
plomo 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 i
y j
estas dos variables operador de incremento, pero en este procedimiento de ejecución, los 10 segundos de sueño, si en el proceso, si stop
el hilo se suspende método, entonces, Will conducir i
y j
datos 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 StopThread
datos 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 StopThreadDemo
clase para utilizar el stop
mé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 StopThreadDemo
clase, crear e iniciar un StopThread
hilo, que se encuentra bajo las variables de ejecución i
y j
el 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 stop
mé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 class
el wait() 、wait(long) 或 wait(long,int) 方法、join()、join(long,int) 或 sleep(long,int)
método de obstrucción, a continuación, interrupt
se lleva a efecto, el estado de interrupción del hilo se borrará, lanza InterruptedException
una 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 StopThreadDemo
se stop
cambió a interrupt
vistazo 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, interrupt
no 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 interrupt
método.
Además de interrupt
fuera 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 while
bucle para ejecutar este programa, por flag
si continuar para controlar el programa, si la rosca externa flag
modificar el false
có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
, interrupt
así 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].