Java 线程的终止与线程中断(3)


public class InterruptTest {
    public static void main(String[] args) {
        Thread thread=new Thread(){
            @Override
            public void run() {
                while(true){
                    if(this.isInterrupted()){//判断当前线程是否是中断状态
                        System.out.println("========true======");
                        break;
                    }
                }
            }
        };
        thread.start();
        try {
            Thread.sleep(0);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt();//调用线程中断方法
    }
}

看代码可以发现这与我们自行控制线程的终断类似。

3、当interrupt() 遇到 sleep() / join ()/wait()时 ,在这里以sleep() 为例子

public static native void sleep(long millis) throws InterruptedException;

看源码可知sleep() 方法  InterruptedException 中断异常,该异常不是运行时异常,所以需要捕获它,当线程在执行sleep()时,如果发生线程中断,这个异常就会产生。该异常一旦抛出就会清除中断状态。

看代码:


public class InterruptTest {
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(){
            @Override
            public void run() {
                while(true){
                    System.out.println("线程状态"+this.isInterrupted());
                    if(Thread.currentThread().isInterrupted()){//判断当前线程是否是中断状态
                        System.out.println("========true======");
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                        System.out.println("===========sleep()结束===========");
                    } catch (InterruptedException e) {
                        System.out.println("异常:"+e.getMessage());
                      // Thread.currentThread().interrupt();
                    }
                }
            }
        };
        thread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("=========interrupt()=============");
        thread.interrupt();//调用线程中断方法
    }
}

执行结果:


线程状态false
=========interrupt()=============
异常:sleep interrupted
线程状态false
===========sleep()结束===========
线程状态false
===========sleep()结束===========
线程状态false
===========sleep()结束===========

由于线程中断的状态被 InterruptedException  异常清除了,所以if()条件中的状态一直是false ,因此该线程不会被终止。如果去掉注释就可以达到线程终止的目的(再次中断自己,设置中断状态)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5c9ed1ffb6e7925ebcdeebf6da5b7d5b.html