线程join()方法的作用

2018-07-03  本文已影响0人  Java程序员

一、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线程,从而达到同步的目的。

上一篇 下一篇

猜你喜欢

热点阅读