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

为什么主线程会先于子线程执行?——Java线程start()方法执行顺序疑问

为什么主线程会先于子线程执行?

这事儿其实和Java线程的调度机制直接相关,咱们拆开了说:

当你调用t.start()的时候,并没有立刻让子线程开始执行——它只是把这个线程从「新建状态」切换到「就绪状态」,相当于告诉JVM:“嘿,这个线程已经准备好干活了,你有空的时候安排它运行哈”。而此时主线程根本不会停下来等,它会立刻继续往下走,执行自己的for循环。

至于到底哪个线程先拿到CPU时间片开始执行,完全是由操作系统的线程调度器决定的,咱们写代码的时候没法100%控制。大部分情况下,主线程因为已经处于运行状态,调度器会先给它分配时间片,所以你会看到主线程的输出先出来。

再把几个关键点掰扯清楚:

  • 线程调度是「抢占式」的:操作系统会根据线程优先级、当前系统负载等各种因素,动态分配CPU时间,谁先拿到谁先执行,没有绝对的固定顺序。
  • start()≠立刻执行:它只是提交了一个启动线程的“申请”,不是直接触发run()方法,run()方法要等调度器选中这个线程才会真正执行。

如果想让子线程先跑完怎么办?

要是你确实需要子线程先执行完毕,主线程再继续,可以用join()方法,它会让主线程主动等待子线程执行完再往下走。修改后的代码大概是这样:

class Mythread extends Thread {
    public void run() {
        for(int i=0;i<=5;i++) {
            System.out.println("child thread........");
        }
    }
}
public class ThreadDemo {
    public static void main(String arg[]) throws InterruptedException { // 需要处理中断异常
        Mythread t=new Mythread();
        t.start();
        t.join(); // 主线程等待子线程执行完成
        for(int i=0;i<=5;i++) {
            System.out.println("main thread........");
        }
    }
}

另外多说一句:有时候你多运行几次原代码,可能会看到子线程先输出的情况,这完全正常——因为调度器的决策是不确定的,每次运行的结果都可能不一样。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:25:36