深入挖掘Thread.interrupt

2018-10-18  本文已影响0人  enjoycc97

如果想中断一个线程或者停止,通常使用interrupt操作,但是这个函数有什么用。
中止一个线程?如果线程正在运行,下一个线程还在运行吗?

public static final void main(String [] args) {
        Thread t = new Thread(new Runnable() {
            public void run() {
                System.out.println("start");
                int i=0;
                while(i==0) {
                    
                }
                System.out.println("end");              
            }
        });
        t.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        t.interrupt();
    }

运行上述代码,发现并没有预期中止线程,是interrupt不生效吗。
查看java doc这个函数一方面是设置interrupted设置为true,
Thread.interrupt()会为true 本身判断会清除标志位
另一方面,像wait sleep join这些阻塞会被唤醒。同时触发异常
测试代码如下。会打印异常信息。


public class Learn {
    public static final void main(String [] args) {
        Thread t = new Thread(new Runnable() {
            public void run() {
                System.out.println("start"+Thread.interrupted());
                int i=0;
                try {
                    Thread.sleep(100000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println("after"+Thread.interrupted());
                System.out.println("end");              
            }
        });
        t.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        t.interrupt();
        System.out.println(t.interrupted());
    }

}

触发打印异常,说明interrupt触发sleep的异常唤醒

上一篇下一篇

猜你喜欢

热点阅读