线程join()方法的深度理解

java 复制代码
package com.tushang.study.Thread;

public class JoinTest {
    public static void main(String[] args) throws InterruptedException {
        Thread threadA = new Thread(() -> {
            System.out.println("线程A");
        });
        Thread threadB = new Thread(() -> {
            try {
                threadA.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程B");
        });
        Thread threadC = new Thread(() -> {
            try {
                threadB.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程C");
        });
        threadB.start();
        threadC.start();
//        threadA.start();
    }
}

输出:

线程B

线程C

原因:

  • 对未启动(NEW 状态)的线程调用 join,JVM 会立刻返回,不会阻塞。
  • 已启动但未结束的线程调用 join,会阻塞直到线程结束。

如果把注释去掉,则会固定输出线程A,线程B,线程C

最后的结论:

对未启动(NEW 状态)的线程调用 join,JVM 会立刻返回,不会阻塞,不管是没有start还是执行的时候还没到start(没来的急),都会立刻返回,不会阻塞 。但是对已启动但未结束的线程调用 join,会阻塞直到线程结束。

相关推荐
子兮曰10 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!10 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰10 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
倒头就睡的小比特10 小时前
算法竞赛C++常用的STL
c++·算法
俊昭喜喜里11 小时前
java中的继承和多态的区别
java
小羊没烦恼!11 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万11 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝11 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕11 小时前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码11 小时前
别再前后端各写一套表单校验了
java·后端