原创

中断线程的正确姿势


1. 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 ;
            }
        }
    }
基础
错误日志提示
面试题集
  • 作者:JarvisYang(联系作者)
  • 发表时间:2020-04-28 16:14
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 评论