You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 16:02:59