关于sleep()和interrupt()及主线程和线程

看代码

public class TestSleep {
    public static void main(String args[]) throws InterruptedException{
        Thread t1 = new CountThread();
        t1.start();
        Thread.sleep(6000);
        System.out.println("即将中断阻塞");
        t1.interrupt();
    }
}
public class CountThread extends Thread{
    private int i = 1;
    
    public CountThread(){
        super("计数线程");
    }
    public void run(){
        while(i<100){
            System.out.println(this.getName()+"计数"+i);
            i++;
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                System.out.println("系统捕获了中断异常");
            }
        }
    }
}

看结果

 

计数线程计数1

计数线程计数2
即将中断阻塞
系统捕获了中断异常

计数线程计数3

计数线程计数4

计数线程计数5

现在看结果,带着问题来看。

为什么中断会发生在第二次循环开始?

  这里就要涉及主线程的问题。当我们创建一个线程是在主线程的基础上,创建一条线程那也是多线程。这里的中断时对于t1这个对象来说,它并不具有中断主线程的能力。也就是,当主线程阻塞的时候,t1.interrupt();没法执行,但是计数线程还在走,第一个循环的sleep()就没能被中断。那么当主线程阻塞结束后,t1.interrupt();开始执行,这时候第二次的sleep(5000)被中断。

posted @ 2016-12-22 16:35  冰镇矿泉水  阅读(2254)  评论(0编辑  收藏  举报