线程join()方法的作用

一、join线程的作用

join()方法:Thread提供的让一个线程去等待另一个线程完成。当在某个程序执行流中(如main线程)调用其它线程(如t2线程)的join方法(t2.join()),调用线程(main线程)将被阻塞,直到被join()方法加入的join线程(t2.start())执行完成为止。

二、示列代码分析

1、在没有join方法的时候

    public class MyJoinTest implements Runnable {
    
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + "====" + i);
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            MyJoinTest myJoinTest = new MyJoinTest();
            Thread t1 = new Thread(myJoinTest, "普通线程");
            Thread t2 = new Thread(myJoinTest, "join的线程");
            t1.start(); //启动t1线程
    
            //下面属于main主线程
            for (int i = 0; i < 10; i++) {
                if (i == 5) {
                    t2.start(); //启动t2线程
                }
                System.out.println(Thread.currentThread().getName() + "====" + i);
            }
        }
    }

输出结果为
main====0
main====1
main====2
main====3
main====4
普通线程====0
普通线程====1
普通线程====2
普通线程====3
普通线程====4
main====5
main====6
main====7
main====8
main====9
join的线程====0
join的线程====1
join的线程====2
join的线程====3
join的线程====4

2、在有join方法的时候

    public class MyJoinTest implements Runnable {
    
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + "====" + i);
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            MyJoinTest myJoinTest = new MyJoinTest();
            Thread t1 = new Thread(myJoinTest, "普通线程");
            Thread t2 = new Thread(myJoinTest, "join的线程");
            t1.start(); //启动t1线程
    
            //下面属于main主线程
            for (int i = 0; i < 10; i++) {
                if (i == 5) {
                    t2.start(); //启动t2线程
                    //main线程调用了t2线程的join方法,导致main线程必须等待t2执行结束才可以向下执行
                    t2.join();
                }
                System.out.println(Thread.currentThread().getName() + "====" + i);
            }
        }
    }

输出结果为
main====0
main====1
main====2
main====3
main====4
普通线程====0
普通线程====1
普通线程====2
普通线程====3
普通线程====4
join的线程====0
join的线程====1
join的线程====2
join的线程====3
join的线程====4
main====5
main====6
main====7
main====8
main====9

3、join()方法的源码

public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }

从源码中可以看到:join方法的原理就是调用相应线程的wait方法进行等待操作的,例如A线程中调用了B线程的join方法,则相当于在A线程中调用了B线程的wait方法,当B线程执行完(或者到达等待时间),B线程会自动调用自身的notifyAll方法唤醒A线程,从而达到同步的目的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容