Java中Thread的join()方法工作机制疑问及代码无限循环原因分析
Java中Thread的join()方法工作机制疑问及代码无限循环原因分析
嘿,我来帮你拆解这段代码里的问题,搞清楚为啥它会陷入看似无限循环的状态~
首先我们先梳理下代码的执行流程,再揪出核心问题:
代码执行时序梳理
- 主方法启动
Thread1线程,进入Thread1的run()方法 Thread1内部创建Thread2实例,把它设为守护线程后启动Thread1调用Thread.sleep(1000),休眠1秒后醒来,打印Inside Thread1- 关键问题出现:
Thread t2 = Thread.currentThread();这里的t2就是当前正在运行的Thread1线程本身!紧接着调用t2.join(),这就触发了致命的阻塞 - 另一边
Thread2启动后,调用Thread.sleep(2000),休眠2秒后醒来,打印Inside Thread2,随后Thread2的run()方法执行完毕(因为它是守护线程,本应随非守护线程结束而退出,但此时Thread1已经卡住了)
核心问题:线程调用自身的join()方法
先明确join()方法的作用:当线程A调用线程B的join()时,线程A会暂停执行,等待线程B执行完毕后才会继续往下走。
但如果一个线程调用自身的join(),就意味着这个线程要等待自己执行完毕才能继续——这完全是个死局!线程自己不可能在阻塞的状态下完成执行,因此会陷入永久阻塞,看起来就像“无限循环”(其实不是循环,是线程一直卡在等待状态)。
额外说明:守护线程的影响
这里Thread2被设为守护线程,但它并不是导致阻塞的原因。哪怕把Thread2改成普通非守护线程,只要Thread1调用了自身的join(),依然会卡住。守护线程只是在所有非守护线程结束后才会被JVM强制终止,但此时Thread1一直阻塞,JVM自然不会退出。
备注:内容来源于stack exchange,提问作者xyz
相关产品推荐
相关产品推荐

