为什么主线程会先于子线程执行?——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
相关产品推荐
相关产品推荐

