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

Java中main方法代码为何先于其他线程执行?

为什么main线程代码会先于创建的线程执行?

嘿,这个问题其实戳中了Java线程调度的几个核心关键点,我来给你掰扯明白:

1. 线程启动本身有开销

当你创建Thread对象并调用start()后,JVM和底层操作系统需要完成一系列准备工作:给新线程分配栈空间、注册线程到调度器、把线程状态从「新建」切换到「就绪」等等。而此时main线程已经在CPU上运行了——这一小段准备时间里,main线程完全可以继续执行自己的代码,所以你会看到main的逻辑先跑起来。

2. 线程调度没有“立即执行”的保证

Java的线程调度是由JVM和底层操作系统共同决定的,它没有任何规则保证你调用start()后,新线程会立刻抢占CPU。main线程作为已经在运行的线程,拥有CPU时间片的天然优势(不是指线程优先级,而是当前正在执行的线程会先用完时间片,除非有更高优先级的线程抢占,但默认优先级都是一致的),所以很大概率会在新线程被调度前继续执行。

举个例子:如果你的main线程里只是简单打印一句话,那这句话几乎肯定会在新线程的输出之前出现——因为新线程还没完成启动流程,main已经把代码执行完了。但如果给main线程加个Thread.sleep(100),你就能看到新线程和main线程并发执行的效果了。

3. 最容易踩的坑:误用run()代替start()

很多新手会犯这个错误:如果直接调用thread.run(),那这根本不是启动新线程,只是在main线程里调用了一个普通方法!这种情况下,run方法里的逻辑会和main线程的代码同步执行,自然不会有并发效果,看起来就是main的代码(包括run方法)按顺序跑完。正确的做法必须是调用thread.start(),这才会触发新线程的创建和启动。

验证小技巧

你可以在main线程和新线程的代码里加上线程名称的打印,比如:

// 新线程的run方法里
System.out.println("当前执行线程:" + Thread.currentThread().getName());
// main线程里也加一句
System.out.println("当前执行线程:" + Thread.currentThread().getName());

这样就能清楚看到代码到底是在哪个线程里执行的,排查起来一目了然。

内容的提问来源于stack exchange,提问作者Nikolas Bozic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:53:43