美文网首页
线程join()方法的作用

线程join()方法的作用

作者: Java程序员 | 来源:发表于2018-07-03 18:59 被阅读0次

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

    相关文章

      网友评论

          本文标题:线程join()方法的作用

          本文链接:https://www.haomeiwen.com/subject/ceujuftx.html