Discuss / Java / 我花了点时间来尝试梳理一下调用t.interrupt()来实现中断的过程,希望能帮没看明白的同学理解,如果有问题可以指正一下

我花了点时间来尝试梳理一下调用t.interrupt()来实现中断的过程,希望能帮没看明白的同学理解,如果有问题可以指正一下

Topic source
1.t线程开始运行,即MyThread()开始运行
2.t线程内运行hello.start()  即启动hello线程,开始运行hello线程
3.hello.join()  等待hello线程运行完成,即跑完hello线程内的run方法,而此时的t线程处于等待之中
4.此时开始运行hello线程内的run方法,开始打印 n hello! 但是后面有一Thread.sleep(100) 会让hello线程暂停100ms
5.hello线程暂停的时候,t线程因为要等待hello线程执行完才能执行,所以现在开始执行main线程
6.main线程执行Thread.sleep(1000),即让main线程暂停1000ms。
7.main线程暂停1000ms的时候是hello线程在执行,我们注意到1000/100 = 10,所以hello线程内的循环会执行10次,这个结果跟打印结果1-10 匹配
8.当main线程1000ms暂停时间结束后且hello线程刚好再一次进入暂停100ms时,又切换到main线程,这次执行的是t.interrupt(),即main线程发出了让t线程中断的命令【注意到后面有一个t.join(),这个很重要,如果没有这个命令,那么main线程会马上打印end】此时的t线程正处于等待hello线程结束的等待状态,它处于一个try-catch语句中,由于收到main线程t.interrupt()的中断信号,因此会抛出InterruptedException,打印interrupted,然后执行hello.interrupt(),即对hello线程发出中断命令,至此,t线程结束,又切换到hello线程
9.此时的hello线程处于正常循环状态或者是暂停100ms之中:a.当处于正常循环状态时,它接到main线程传给它的中断信号,isInterrupted()为真,不执行while循环内的语句,run方法执行完毕,hello线程结束。
b.当处于暂停之中时,由于它也处于一个try-catch语句之中,接收main线程执hello.interrupt()传递的中断信号时会捕获InterruptedException,然后执行break,同样结束run方法使得hello线程结束
10.当hello线程结束后,最后执行main线程  打印end

总结得非常棒!感谢!有个地方想修正一下,main线程应该是在t线程结束后直接结束,打印end的,并不需要等hello线程结束,main和hello线程谁先结束无法确定。还有hello线程是接收 t 线程传递的中断信号

Raylan-XL

#3 Created at ... [Delete] [Delete and Lock User]

第5点,和第9点都是错误的。

hello线程暂停的时候,t线程因为要等待hello线程执行完才能执行,所以现在开始执行main线程

为什么需要等t线程和hello线程才开始执行main线程?

9.a的描述错误,可以参考下面大家的评论


  • 1

Reply