Java自定义线程存活异常:主线程休眠后为何仍未结束?
线程isAlive()返回true的原因分析
你的问题核心在于对线程执行时间的判断偏差,具体拆解如下:
线程执行时间线梳理
先看CustomThread的run方法逻辑:每次循环先执行1秒sleep,再打印信息,循环共5次:
- 线程启动后0-1秒:sleep,打印
first sleeping since 1 seconds - 1-2秒:sleep,打印
first sleeping since 2 seconds - 2-3秒:sleep,打印
first sleeping since 3 seconds - 3-4秒:sleep,打印
first sleeping since 4 seconds - 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
相关产品推荐
相关产品推荐

