Java程序中是否存在僵尸线程?Thread.start()方法执行逻辑解析
问题与分析
先看示例代码:
public... main( String[] args ) // 懒得写完整代码了 new ThreadExample().start(); // run方法仅打印"this is run" }
假设调用start()的瞬间,调度器切回主线程并让主线程结束,需要解答以下问题:
- 调用
start()创建的线程会发生什么? - 该线程为非守护线程,程序是否会继续执行?会不会变成僵尸线程?
- 无同步机制的情况下可能出现什么情况?
补充说明:这个问题本质等价于「Thread.start()方法具体执行了什么逻辑?」
核心解答
1. 新线程的执行状态
调用Thread.start()时,JVM会完成三个关键动作:
- 为新线程分配栈空间等系统资源
- 将线程状态从
NEW标记为RUNNABLE - 向操作系统调度器发起请求,安排该线程执行
哪怕调用start()后立刻切回主线程并让主线程结束,只要新线程是非守护线程,它的run()方法依然会被执行。因为start()已经完成了线程初始化的核心步骤,线程已经被注册到JVM的线程列表中,操作系统会按调度逻辑启动它的执行。
2. 程序的存活状态与线程资源
- 程序会继续执行:Java虚拟机的退出条件是所有非守护线程都终止,主线程结束但新的非守护线程仍在运行时,程序会保持存活,直到该线程执行完
run()方法。 - 不会变成僵尸线程:僵尸线程指已终止但资源未被回收的线程,Java中JVM会自动管理线程资源,当非守护线程执行完
run()后会进入TERMINATED状态,JVM会自动清理它的资源,不会残留僵尸线程。
3. 无同步机制的影响
在这个问题的简单场景里(新线程仅执行打印操作),无同步机制不会引发异常,新线程依然能正常打印内容后终止,程序随之退出。但如果是主线程与新线程共享数据的复杂场景,无同步机制可能导致:
- 可见性问题:主线程修改的共享变量,新线程可能无法读取到最新值
- 指令重排序:JVM的指令重排可能导致线程执行顺序不符合预期
关于Thread.start()的核心逻辑
start()的本质是启动一个独立的执行线程,而非直接调用run()方法。它通过本地方法start0()向操作系统申请创建线程,操作系统完成线程创建后,会调度该线程执行run()中的逻辑。如果直接调用run(),只是在当前线程中执行一个普通方法,并不会启动新线程。
内容的提问来源于stack exchange,提问作者kesarling
相关产品推荐
相关产品推荐

