未继承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
相关产品推荐
相关产品推荐

