线程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,会阻塞直到线程结束。

相关推荐
堕274几秒前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法
亓才孓15 分钟前
[Class的应用]获取类的信息
java·开发语言
开开心心就好23 分钟前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
爱喝白开水a26 分钟前
前端AI自动化测试:brower-use调研让大模型帮你做网页交互与测试
前端·人工智能·大模型·prompt·交互·agent·rag
董世昌4127 分钟前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
80530单词突击赢35 分钟前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
Wei&Yan1 小时前
数据结构——顺序表(静/动态代码实现)
数据结构·c++·算法·visual studio code
爬山算法1 小时前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
云姜.1 小时前
线程和进程的关系
java·linux·jvm
是码龙不是码农1 小时前
支付防重复下单|5 种幂等性设计方案(从初级到架构级)
java·架构·幂等性