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

未继承Thread类且用无参构造创建线程的后台运行机制探究

关于Thread线程的两个问题解答

问题1:未继承Thread类,用无参构造创建Thread实例会发生什么?

咱们直白点说,当你用new Thread()无参构造创建线程对象时,这个线程的目标执行体(Runnable类型的target)是null——毕竟你既没传入实现了Runnable的对象,也没继承Thread并重写run()方法来指定要跑的逻辑。

那这个线程启动后会干啥?看Thread类的默认run()方法就明白了:

public void run() {
    if (target != null) {
        target.run();
    }
}

因为target是null,这个run()方法啥实际事儿都不做,直接结束。也就是说,这个线程被启动后,会立刻走完生命周期,纯纯是个“空跑”的线程,不会执行任何你期望的业务逻辑。

问题2:执行给定代码时后台会发生什么?

先把代码贴出来:

class TestThread {
    public static void main(String[] args) {
        Thread t = new Thread();
        t.start();
        System.out.println(t.getName());
    }
}

咱们一步步拆解后台的执行流程:

  • 首先JVM启动,main线程开始运行,执行main方法里的代码。
  • 创建Thread t实例:无参构造下,t的target是null,同时Thread类会自动给这个未命名的线程分配默认名字,格式是Thread-N(N从0开始递增,第一次创建一般就是Thread-0)。
  • 调用t.start():这步可不是直接执行run()方法!它是告诉JVM的线程调度器:“这个线程可以安排执行了”。JVM会为线程t分配专属的栈空间、程序计数器等线程必备资源,然后把线程t的状态从NEW(新建)转为RUNNABLE(可运行)。
  • 紧接着main线程不会等,继续往下执行System.out.println(t.getName()),输出线程t的默认名字(比如Thread-0)。
  • 当线程调度器选中线程t执行时,它的run()方法因为target是null,直接执行完毕,线程t的状态变成TERMINATED(终止),生命周期就此结束。

这里要提一句:main线程和线程t的执行顺序没有绝对先后——有可能main先输出名字,线程t才启动结束;也有可能线程t先跑完,main再输出名字,这完全取决于JVM的线程调度策略,没人能100%确定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:10:09