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

Java自定义线程存活异常:主线程休眠后为何仍未结束?

线程isAlive()返回true的原因分析

你的问题核心在于对线程执行时间的判断偏差,具体拆解如下:

线程执行时间线梳理

先看CustomThread的run方法逻辑:每次循环先执行1秒sleep,再打印信息,循环共5次:

  1. 线程启动后0-1秒:sleep,打印first sleeping since 1 seconds
  2. 1-2秒:sleep,打印first sleeping since 2 seconds
  3. 2-3秒:sleep,打印first sleeping since 3 seconds
  4. 3-4秒:sleep,打印first sleeping since 4 seconds
  5. 4-5秒:sleep,在第5秒时刚好结束sleep,但此时还没执行打印first sleeping since 5 seconds的代码,run方法也没走完

而main线程的流程是:启动first线程后立刻sleep5秒,5秒一到就调用first.isAlive()——这时候first线程刚结束最后一次sleep,还处于run方法的执行过程中,自然返回true。之后first线程才会完成最后一次打印,再执行结束语句,线程才终止。

为什么等待线程启动的代码没用?

你添加的while(!first.isAlive())只是确保first线程已经启动,但问题根本不是线程启动延迟,而是main线程的等待时间刚好卡在了first线程尚未完全结束的节点上,所以这个修改对结果没有影响。

解决方法

方法1:延长main线程的等待时间

给first线程留出执行最后一段代码的时间,比如把Thread.sleep(5000)改成Thread.sleep(5100),这样main线程醒来时,first线程已经完成所有操作并终止,isAlive()会返回false。

方法2:使用join()(更可靠)

Thread.join()方法会让当前线程(这里是main线程)等待目标线程(first线程)完全终止后再继续执行,这是线程同步的标准做法,无需手动计算等待时间:

Thread first = new Thread(new CustomThread("first"));
first.start();
first.join(); // 等待first线程执行完毕
System.out.println(first.isAlive()); // 此时输出false

内容的提问来源于stack exchange,提问作者smilly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:50:34