美文网首页
线程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()方法作用join作用是让其他线程变为等待, t1.join();// 让其他线程...

  • Join() 方法 & ThreadLocal 类的使用

    方法 Join 的使用 join() & join(long)方法 join()作用:在 A 线程中调用了 B 线...

  • join用法

    join的作用 join可以让线程排队执行,而join的内部采用wait方法来实现等待。而join的作用是等待线程...

  • java线程之Thread.join()方法

    1. Thread.join 方法的作用 方法 join 的作用是 使所属的线程对象正常执行 run() 方法中的...

  • 并发

    保证多线程的顺序执行 方式1:通过join方法保证多线程的顺序join作用:让主线程等待子线程结束后才能继续运行 ...

  • yield vs join

    join 方法join的作用是使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期的阻塞,等...

  • join方法的使用

    1.join的基本用法:方法join的作用是使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无...

  • 线程核心方法-Join

    源码 join()方法的作用,是等待这个线程结束。从源码中不难发现,其实Join()方法最终调用的是wait()方...

  • 线程join()方法的作用

    一、join线程的作用 join()方法:Thread提供的让一个线程去等待另一个线程完成。当在某个程序执行流中(...

  • Thread类中join方法的实现原理

    一.简介 join()是Thread类的一个方法,根据jdk文档的定义,join()方法的作用,是等待这个线程结束...

网友评论

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

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