主线程执行打印语句后启动子线程,子线程能否先输出结果?
关于Java多线程输出顺序的疑问解答
先看你提供的代码:
public static void main (String [] args) { System.out.println("main printed"); new Thread( () -> System.out.println("Thread-1 printed")).start(); }
你的假设完全成立——理论上确实存在两种输出顺序的可能:要么主线程先输出,要么子线程先输出。
之所以实际多次运行都是主线程先输出,原因在于:
- 主线程本身已经处于运行状态,执行
System.out.println的操作开销极低,几乎瞬间就能完成。 - 而创建新线程需要经过线程对象初始化、向操作系统提交调度请求、操作系统完成线程上下文切换等一系列步骤,这个过程的开销远大于一行打印代码的执行成本。所以在绝大多数场景下,主线程的打印会先完成。
但这只是概率问题,不是绝对的。如果遇到特殊的系统负载情况,或者操作系统调度器刚好在主线程执行打印前就完成了新线程的调度,子线程就会先输出。只是这种情况出现的概率极低,靠手动运行很难碰到而已。
内容的提问来源于stack exchange,提问作者Wasserentzug
相关产品推荐
相关产品推荐

