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

请求解释两段Java线程代码(Join1、Join2)的输出逻辑

解释Java Thread.join() 示例(Join1)的输出结果

先给你把代码和输出格式化好,方便咱们分析:

完整的Join1代码

public class Join1 { 
    public static void main(String[] args) { 
        Thread t = new Thread() { 
            public void run() { 
                System.out.print("EnterValue:"); 
                try { 
                    System.in.read(); 
                } catch (Exception ex) {} 
                System.out.println("Thread Finished."); 
            } 
        }; 
        System.out.println("Starting Thread"); 
        t.start(); 
        System.out.println("Joining"); 
        try { 
            t.join(); 
        } catch (Exception ex) {} 
        System.out.println("Main Finished."); 
    } 
}

运行输出

Starting Thread
Joining
EnterValue: 
Thread Finished.
Main Finished.

咱们一步步拆解执行流程,你就能彻底搞懂这个输出顺序:

  1. 主线程先启动,输出第一行
    程序启动后,主线程(main方法所在线程)先执行System.out.println("Starting Thread");,所以控制台先打出Starting Thread。

  2. 启动子线程,但不阻塞主线程
    调用t.start()后,JVM会把这个子线程标记为可运行状态,等待调度执行。但start()方法不会让主线程停下来等,所以主线程立刻继续往下走。

  3. 主线程输出第二行,然后进入等待
    主线程执行System.out.println("Joining");,打出Joining;接下来调用t.join()——这个方法的核心作用就是让调用它的线程(这里是主线程)暂停,直到目标线程(子线程t)完全执行完毕。所以主线程会卡在这一步,不再往下走。

  4. 子线程开始执行,等待用户输入
    子线程被JVM调度后,先执行System.out.print("EnterValue:");,打出提示语;然后System.in.read()会让子线程阻塞,直到你输入一个字符(按回车就行)。

  5. 子线程完成,主线程恢复执行
    当你输入完成后,子线程继续执行,打出Thread Finished.,然后子线程的run()方法结束,子线程终止。这时候主线程的t.join()等待结束,继续往下执行,最后打出Main Finished.。


核心知识点总结:

  • Thread.start()只是启动线程,不会阻塞当前线程,所以主线程能先打出Joining
  • Thread.join()是线程同步的关键方法,它强制调用线程等待目标线程完成,所以Main Finished.一定在子线程输出之后
  • System.in.read()会阻塞当前线程,这就是为什么你需要手动输入后程序才会继续的原因

如果你能把Join2的完整代码贴出来,我也可以帮你分析它的输出逻辑~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:34:20