Thread的Join方法异常行为疑惑及相关代码咨询
嘿,我来帮你拆解一下你遇到的这个Thread.join()的困惑点~
首先,先明确你代码里join()的实际作用:当你在main线程里调用demoThread1.join()时,main线程会暂停执行,直到demoThread1完全运行结束;之后调用demoThread2.join(),main线程会继续等待demoThread2执行完毕,才会继续往下走打印Ending Main program.。
那你可能困惑的点是什么呢?我猜大概率是:为什么两个线程demoThread1和demoThread2的输出还是交替出现,而不是先打印完demoThread1的所有内容,再打印demoThread2的?
这是因为你在调用join()之前,已经通过demoThread1.start()和demoThread2.start()让两个线程同时启动并行执行了。join()只是控制main线程的等待时机,并不会改变这两个线程之间的执行顺序——它们的调度完全由JVM和操作系统的线程调度器决定,所以输出交替是完全正常的行为。
如果想要让demoThread1执行完毕后再启动demoThread2,你需要调整代码顺序:
public class JoinDemo { public static void main(String args[]) { JoinDemoThread1 joinDemoThread1 = new JoinDemoThread1(); JoinDemoThread2 joinDemoThread2 = new JoinDemoThread2(); Thread demoThread1 = new Thread(joinDemoThread1); Thread demoThread2 = new Thread(joinDemoThread2); demoThread1.start(); // 先等demoThread1跑完,再启动demoThread2 try { demoThread1.join(); } catch (Exception e) { System.out.println("Interrupted"); } demoThread2.start(); try { demoThread2.join(); } catch (Exception e) { System.out.println("Interrupted"); } System.out.println("Ending Main program."); } }
另外,你提到“Java 8引入Lambda/Streams后多线程技术看似过时”,其实这是个误解哦:Lambda和Streams只是简化了集合操作和函数式编程,而多线程(包括Thread、ExecutorService、CompletableFuture等)是处理异步、高并发、后台任务的核心技术,在很多实际项目里都是刚需——比如电商系统的订单异步处理、大数据批量任务、后台定时任务等等,完全没有过时~
最后再补充一下你原代码的执行流程:
- main线程启动demoThread1和demoThread2,两个线程开始并行输出内容;
- main线程调用
demoThread1.join(),进入等待状态,直到demoThread1的run方法执行完毕; - 此时demoThread2可能还在运行,也可能已经结束,main线程继续调用
demoThread2.join(),等待它结束; - 两个线程都结束后,main线程恢复执行,打印
Ending Main program.。
内容的提问来源于stack exchange,提问作者raky

