看代码
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)被中断。