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

相关推荐
咖啡八杯6 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
kyriewen8 小时前
别再 console.log 了:5 个 Chrome DevTools 调试技巧,用过就回不去了
前端·javascript·面试
IT_陈寒10 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
To_OC10 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
DigitalOcean11 小时前
Laravel 开发者已在 DigitalOcean 上开通超过 10 万台服务器
前端·laravel
星始流年11 小时前
从 Tool 到 Skill——基于 LangChain 的服务端Skill实现
前端·langchain·agent
李惟11 小时前
开源本地通信库,纯客户端 RPC,像聊天一样通信
前端
YAwu1111 小时前
深入解析 React 炫彩鼠标跟随标题组件:从坐标定位到动画性能
前端·react.js
GuWenyue11 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试