三:线程中断

作者: 知耻而后勇_zjh | 来源:发表于2017-07-31 11:24 被阅读0次

    线程中断并不会让线程立即退出,而是给线程发送一个通知,告诉目标线程,现在希望他退出,至于线程接到通知后如何处理,完全由目标线程自己确定.
    JDK里面,线程中断有三个方法:

           public void Thread.interrupt()   //中断线程
           public boolean Thread.isInterrupt()   //判断线程是否被中断
           public static boolean Thread.interrupted() //判断线程是否被中断,并且清除当前中断状态
    
    public static void main(String[] args) throws Exception {
        Thread t1 = new Thread(){
            @Override
            public void run() {
                Thread.yield();
            }
        };
        t1.start();
        Thread.sleep(2000);
        t1.interrupt();
    }
    
    
    此处虽然对t1进行了中断,但是t1中没有任何中断处理的逻辑代码,所以这个中断不会有任何左右.
     如果希望t1 在中断后退出,做以下即可
    
    public static void main(String[] args)throws InterruptedException {
        Thread t1 = new Thread(){
            @Override
            public void run() {
                while (true){
                    if (Thread.currentThread().isInterrupted()){
                        System.out.println(Thread.currentThread().getName());
                        System.out.println("Interrupt");
                        break;
                    }
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        System.out.println("线程在睡眠时被中断");
                        Thread.currentThread().interrupt();
                    }
                    Thread.yield();
                }
            }
        };
        t1.start();
        Thread.sleep(1000);
        t1.interrupt();
    }
    
    需要注意的是Thread.sleep(); 会抛出  InterruptedException 异常 ,此异常不是运行时异常,也就是说程序必须捕获处理它. 当程序运行被中断时,System.out.println("线程在睡眠时被中断")被执行,但是为了保证数据完整性,需要再次执行Thread.currentThread().interrupt()方法以重置标志位,才能再次判断中断情况。

    相关文章

      网友评论

        本文标题:三:线程中断

        本文链接:https://www.haomeiwen.com/subject/dvfzkxtx.html