qq_大人物_0
2016-03-25 10:59
第10行的 sleep() 为什么不会使interrupt抛出异常
感觉听视频里讲,不如来看评论,评论描述的还清楚些
第10行的sleep,休眠的是main主线程,这样thread线程可以独占cpu运行。主线程休眠了3秒,中间thread输出了三条Thread is running,每秒一条。sleep结束后,主线程重新占用cpu,输出interrupting threading。。。主线程又休眠三秒,让出cpu,但是interrupt没有起作用(为什么?)thread 继续每秒一条无限输出
根据我知道的说一下我的理解,不保证一定正确,如有错误欢迎指正。
其实这个问题引出了一些很有用的点。
先把视频中的代码贴出来,除了最后几行,行数都是对应的
package base; public class WrongWayStopThread extends Thread { public static void main(String[] args) { WrongWayStopThread thread = new WrongWayStopThread(); System.out.println("Starting Thread..."); thread.start(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Interrupting Thread..."); thread.interrupt(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Stopping Application..."); } @Override public void run() { while (true) { System.out.println("Thread is running"); long time = System.currentTimeMillis(); while (System.currentTimeMillis() - time < 1000) { // ... } } } }
第一个点,main本身也是一个线程,通常称为主线程,这个程序一开始做的事情是,主线程创建了一个WrongWayStopThread实例,叫做thread,并start之,此时主进程和thread同时运行
第二个点,sleep()是static的,sleep()做的事情是将“当前sleep()所在”进程休眠
题主说的第十行附近的
Thread.sleep(3000);
是对语句所在进程,即主进程进行sleep。注意这里的Thread是大写,代表的是调用Thread类的静态方法sleep。
(注意即使改成小写thread.sleep(3000),因为是static方法,执行的是的同样操作,依旧是休眠主进程,可以试验验证。换句话说,不管怎么写sleep,一个线程只能对自己进行自发的sleep,不能sleep别的进程)
然后15行的
thread.interrupt();
注意interrupt不是static,任意进程都可以对指定的另一个线程做interrupt,这里thread是小写,指的是主线程对刚刚创建的WrongWayStopThread实例thread做interrupt。
总结就是,第十行左右的sleep的线程,和之后interrupt的线程,不是同一个线程,所以不会影响。但我认为这其中的原理更重要。
sleep()方法只是使当前线程暂时进入休眠状态,并没有阻断当前线程的运行。
深入浅出Java多线程
186088 学习 · 464 问题
相似问题