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

相关推荐
xcl09254 小时前
商超智能运营实战:数据驱动提升门店效率与体验指南
java·mfc·宠物
web打印社区5 小时前
网页静默打印热敏小票:从 HTML 到出纸的完整指南
前端·javascript·vue.js·electron·pdf·html
剪刀石头布啊6 小时前
设计一个多计时任务的任务管理功能
前端
Flynt6 小时前
OpenJDK禁AI代码半年了,现在执行得怎么样?答案是:全靠自觉
java·开源·ai编程
ModyQyW7 小时前
vite-plugin-uni-manifest 更新了什么
前端·typescript·uni-app
Asize8 小时前
AI 协作开发新范式:我用 SDD 做了个排版 npm 包
前端·人工智能
kyriewen9 小时前
我把今年流传的前端 AI 面试题整理了一遍——4 类场景题+回答框架(附速查表)
前端·面试·程序员
计算机魔术师10 小时前
国产多模态模型正面硬刚Opus旗舰:差距从30%缩到3%
前端
风骏时光牛马10 小时前
程序员进阶:深度思考,解锁职场成长的底层逻辑
前端
IT_陈寒10 小时前
用了Proxy才发现以前的JavaScript白写了
前端·人工智能·后端