Java线程循环为何按顺序执行?新手技术求助
问题:Java多线程输出交替但线程内循环顺序的原因
public class Meh { public static void main(String[] args) { Thread th2=new Thread() { public void run(){ for (int i=0;i<=10;i++) { System.out.println("No 2 "+i); } } }; Thread th1=new Thread() { public void run(){ for (int i=0;i<=10;i++) { System.out.println("No 1 "+i); } } }; for (int i=0;i<=10;i++) { System.out.println("main "+i); } th1.start(); th2.start(); } }
我是Java初学者,编写了上述多线程代码后发现:三个线程的循环输出会交替出现,但每个线程内部的循环却是按顺序执行的,想请教这一现象的原因是什么?
解答
嘿,这个问题问到核心点上了,刚好能帮你吃透Java多线程的基础逻辑~咱们分两个维度来解释这个现象:
一、线程间输出交替:操作系统的线程调度在起作用
当你调用th1.start()和th2.start()后,加上原本运行的main线程,一共三个线程进入了操作系统的「就绪线程队列」。操作系统的线程调度器会根据自身的调度规则(比如时间片轮转、优先级策略),给每个线程分配一段短暂的CPU执行时间(也就是常说的「时间片」):
- 一旦某个线程用完了自己的时间片,或者因为执行I/O操作(比如
System.out.println涉及控制台输出,属于I/O操作,会暂时让出CPU),调度器就会暂停这个线程,把CPU资源切换给另一个就绪的线程。 - 这种切换是自动且不可控的(除非你用同步机制干预),所以你会看到三个线程的输出交替出现——不过你的代码里
main线程的循环是在启动其他线程前执行的,所以main的输出会先连续打印完,之后才是th1和th2的输出交替出现。
二、线程内循环顺序:单个线程的执行是串行的
每个线程的run()方法是它的专属执行逻辑,在同一个线程内部,代码的执行是严格按照编写顺序串行执行的,这是线程的基本特性:
- 以
th1为例,它的run()方法里的循环从i=0开始,每次执行流程都是:判断i<=10→ 打印No 1 + i→i++。只要这个线程拿到CPU时间,就会按这个流程一步步走,不会跳步或者乱序。 - 就算中途线程被调度器暂停,下次它重新获得CPU时间时,会从上次暂停的位置继续执行(比如上次执行到
i=3打印完成,下次就从i++变成4,接着判断4<=10,再打印No 1 4)。所以每个线程内部的输出必然是从0到10依次递增,不会出现混乱。
再举个更具象的场景
假设操作系统给th1分配的时间片只能支持3次循环:它会先输出No 1 0、No 1 1、No 1 2,时间片用完后调度器切换到th2,th2输出No 2 0、No 2 1,时间片用完再切回th1,th1继续从i=3开始执行直到循环结束。整个过程中,两个线程的输出交替,但各自内部的i都是按顺序增长的。
内容的提问来源于stack exchange,提问作者Blackjack
相关产品推荐
相关产品推荐

