关于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)被中断。