• Java:join方法详解


    概念

    Thread类提供了让一个线程等待另一个线程完成的方法——join()方法

    当在某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的join线程执行完为止。

    join()方法通常由使用线程的程序调用,以将大问题划分成许多小问题,每个小问题分配一个线程。当所有的小问题都得到处理后,再调用主线程来进一步操作。

    原理

    直接看他的源码:

    /*
        等待这个线程死掉。
        调用此方法的行为完全相同
        作为调用的方式
        <块引用>
        {@linkplain #join(long) 加入}{@code (0)}
        
        @throws 中断异常
        如果任何线程中断了当前线程。这当前线程的中断状态是抛出此异常时清除。
    */
    public final void join() throws InterruptedException {
        join(0);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    再深入这个 join(0)

    内部调用了一个wait 实现线程阻塞

    在这里插入图片描述
    注意这里的wait是 Object的native wait方法是将当前线程阻塞,而不是将当前调用的对象的线程阻塞,当前线程是主线程,所以主线程会阻塞。

    当子线程执行完后,他会去唤醒main继续执行。

    在这里插入图片描述

    原理图如下所示:
    在这里插入图片描述

    总结

    join内部调用 Object的native wait方法是将当前线程阻塞,而不是将当前调用的对象的线程阻塞,当前线程是主线程,所以主线程会阻塞,当子线程执行完后,他会去唤醒main继续执行。

    代码案例:实现子线程先执行,主线程再执行

    启动子线程后,立即调用该线程的join()方法,则主线程必须等待子线程执行完成后再执行

    package com.yyl.threadTest;
    
    public class TestThreadMethod {
        public static void main(String[] args) throws InterruptedException {
            Thread thread = new Thread(() -> {
                try {
                    System.out.println("等3s再执行");
                    Thread.sleep(3000);
                    System.out.println("3s后了可以执行了");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子线程执行了");
            });
            thread.start();
    		thread.join();
            System.out.println("主线程执行了");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    运行结果如下:
    在这里插入图片描述
    如果不加join,主线程就不会等待直接输出,如下所示
    在这里插入图片描述

  • 相关阅读:
    Spring Boot实现热部署有哪几种方式
    spi个人笔记
    dockerfile避坑笔记(VMWare下使用Ubuntu在Ubuntu20.04基础镜像下docker打包多个go项目)
    国产操作系统之优麒麟安装
    Java学习笔记之----I/O(输入/输出)二
    献给初学者:谈谈如何学习Linux操作系统
    H - Hot Black Hot White(数论/取模运算)
    pytorch实现数据集读取/下载
    unity操作_Camera c#
    图解 cv2.HoughLines & cv2.line 参数原理
  • 原文地址:https://blog.csdn.net/weixin_45525272/article/details/126367196