请求解释两段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.
咱们一步步拆解执行流程,你就能彻底搞懂这个输出顺序:
主线程先启动,输出第一行
程序启动后,主线程(main方法所在线程)先执行System.out.println("Starting Thread");,所以控制台先打出Starting Thread。启动子线程,但不阻塞主线程
调用t.start()后,JVM会把这个子线程标记为可运行状态,等待调度执行。但start()方法不会让主线程停下来等,所以主线程立刻继续往下走。主线程输出第二行,然后进入等待
主线程执行System.out.println("Joining");,打出Joining;接下来调用t.join()——这个方法的核心作用就是让调用它的线程(这里是主线程)暂停,直到目标线程(子线程t)完全执行完毕。所以主线程会卡在这一步,不再往下走。子线程开始执行,等待用户输入
子线程被JVM调度后,先执行System.out.print("EnterValue:");,打出提示语;然后System.in.read()会让子线程阻塞,直到你输入一个字符(按回车就行)。子线程完成,主线程恢复执行
当你输入完成后,子线程继续执行,打出Thread Finished.,然后子线程的run()方法结束,子线程终止。这时候主线程的t.join()等待结束,继续往下执行,最后打出Main Finished.。
核心知识点总结:
Thread.start()只是启动线程,不会阻塞当前线程,所以主线程能先打出JoiningThread.join()是线程同步的关键方法,它强制调用线程等待目标线程完成,所以Main Finished.一定在子线程输出之后System.in.read()会阻塞当前线程,这就是为什么你需要手动输入后程序才会继续的原因
如果你能把Join2的完整代码贴出来,我也可以帮你分析它的输出逻辑~
内容的提问来源于stack exchange,提问作者JohnBanter
相关产品推荐
相关产品推荐

