中断线程的正确姿势
suspend、resume、stop方法可以将对应的线程赞同他、恢复、停止,但是现在这些API都不再推荐使用,原因是suspend会占用着资源进入睡眠状态,这样容易引发死锁问题,stop方法在终结一个线程时不会保证线程的资源被正确释放。
要中断一个线程最好的办法时使用线程的interrupt方法,它可以理解为线程的一个标识位属性。其他线程通过调用该线程的interrupt方法来对其进行中断操作,这个方法可以理解为其他线程向该线程打了个招呼“发生中断啦,你该对这个中断进行处理”,而不是强制的让线程停止。
线程可以通过检查自身是否被中断来进行响应,线程通过方法isInterrupted()
来进行判断是否被中断,也可以调用静态方法Thread.interrupted()对当前线程的中断标识位进行复位。
如果线程处于Waiting或Blocked等阻塞或是等待状态,那么中断将会导致该线程被唤醒,Java虚拟机对该线程的中断标志位清除,然后抛出InterruptedException。
/*
停止线程的正确姿势
*/
public class Shutdown {
public static void main(String[] args) throws Exception{
Runner one = new Runner();
Thread countThread = new Thread(one,"CountThread");
countThread.start();
TimeUnit.SECONDS.sleep(1);
countThread.interrupt();
Runner two = new Runner();
countThread = new Thread(two,"CountThread");
countThread.start();
TimeUnit.SECONDS.sleep(1);
two.cancle();
}
private static class Runner implements Runnable{
private long i ;
private volatile boolean on = true ;
@Override
public void run() {
while(on && !Thread.currentThread().isInterrupted()){
i ++ ;
}
System.out.println("Count i = " + i);
}
public void cancle() {
on = false ;
}
}
}