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

Thread的Join方法异常行为疑惑及相关代码咨询

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:22:41