协作式中断
在以前的JDK版本中,Thread类包含stop() ,suspend(), destroy() ,resume()方法可以操作线程,其中stop方法强行终止正在运行或挂起的线程,调用这个方法是非常危险的,就跟直接关掉计算机电源一样,因此这些方法现在都已经被弃用,取而代之的是interrupt() 、 isInterrupted()、static方法interrupted(),通过这些办法中断线程是属于协作式的中断,既停不停止由线程本身决定。
中断线程执行的方法
自定义标识
public class test1 {
public static volatile boolean exit =false; //退出标志
public static void main(String[] args) {
new Thread() {
public void run() {
System.out.println("线程启动了");
while (!exit) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("线程结束了");
}
}.start();
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
exit = true;//5秒后更改退出标志的值,没有这段代码,线程就一直不能停止
}
}
这是网上copy下来的一段代码,该代码中用exit
变量作为标识来判断是否线程要停止执行,在大多数情况下,这种方法都是可行的。然而假如要停止的线程当前处于阻塞状态,那么即使设置了标识,也不会去判断,就会出现终止不了的情况。
interrupt() 、 isInterrupted()
public class test1 {
public static volatile boolean exit =false; //退出标志
public static void main(String[] args) {
Thread thread = new Thread() {
public void run() {
System.out.println("线程启动了");
while (!isInterrupted()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("线程结束了");
}
}.start();
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();
}
}
上述代码可以这样进行修改,可以达到相同的相关,如果线程处于阻塞状态,调用interrupt()方法就会抛出异常,这样就不会出现一直阻塞的情况。
InterruptedException后标识重置
调用interrupt()方法,方法发生InterruptedException异常时,会把中断标识清除,此时需要在catch中重新调用interrupt()方法,将标识重新设为true。