Java:join方法详解

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:join方法详解相关的知识,希望对你有一定的参考价值。

文章目录

概念

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

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

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

原理

直接看他的源码:

/*
    等待这个线程死掉。
    调用此方法的行为完全相同
    作为调用的方式
    <块引用>
    @linkplain #join(long) 加入@code (0)
    </blockquote>
    @throws 中断异常
    如果任何线程中断了当前线程。这当前线程的中断状态是抛出此异常时清除。
*/
public final void join() throws InterruptedException 
    join(0);

再深入这个 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("主线程执行了");
    


运行结果如下:

如果不加join,主线程就不会等待直接输出,如下所示

以上是关于Java:join方法详解的主要内容,如果未能解决你的问题,请参考以下文章

Java Thread.join()详解--父线程等待子线程结束后再结束

03Java 8 - Collectors.joining() 详解

Java Concurrency/Threads——join详解

Java线程编程中isAlive()和join()的使用详解

JUC并发编程 -- 线程常用方法之join()详解 & join同步应用 & join限时同步

Fork/Join框架详解