美文网首页技术干货程序员
JAVA多线程09-基础篇-线程等待join

JAVA多线程09-基础篇-线程等待join

作者: x_coder | 来源:发表于2017-10-27 09:29 被阅读0次

本节摘要:join()的功能介绍,基本用法,源码分析,代码示例

一、功能介绍

join()使当前线程等待子线程执行完毕后,才能继续执行

二、基本用法

    public static void main(String[] args) {
        //1.new 一个线程 t1
        MyThread t1= new MyThread("t1");
        //2. 启动 t1
        t1.start();
        try {
            //3. t1线程开始执行,当前线程等待t1执行后才能继续执行
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

三、源码分析

join()方法在Thread类中,有三个重载的join方法,如果被中断会抛出InterruptedException异常

注:以下代码解析以第二部分的样例代码举例(下同)

3.1 join()方法解析

 // Waits for this thread to die.
public final void join() throws InterruptedException {
        join(0);
    }

注释的含义是等待这个线程死亡,也就是说:当前线程(main)会等待调用join()方法的线程(t1)死亡,才能继续执行,否则一直等待。

3.2 join(millis)方法解析

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()) {//如果子线程一直存活,当前线程会一直等待,这里就是join核心作用体现
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }

这是一个synchronized方法,核心是isAlive()和wait()方法,我们先看一下isAlive()方法

    /**
     * Tests if this thread is alive. A thread is alive if it has
     * been started and has not yet died.
     */
    public final native boolean isAlive();

这是一个本地方法,大概意思是测试这个线程(this thread)是否存活,如果线程可运行且没有死亡就是存活的。

那么问题来了:这个线程是哪个线程呢?
回答:我们发现 isAlive()方法和join()方法都描述为this thread,所以this thread 就是调用join()方法的线程,即t1线程。

接下来看一下wait()方法
我们知道,wait()方法属于java.lang.Object 类,调用线程必须获得对象锁才能调用wait()方法,而join方法又是synchronized方法,也就是说当前线程(main)在调用t1.join()方法时,获得到了t1的对象锁,这段逻辑类似如下代码

synchronized(t1){
    while(t1.isAlive())
          t1.wait(0);
}

当调用线程(main)执行t1.wait(0)时,调用线程(main)会释放t1的锁,一直等待t1线程执行结束(死亡),调用线程(main)才会继续执行

三、代码示例

public class JoinDemo {

    public static void main(String[] args) {
        MyThread threadA = new MyThread("t1");
        System.out.println(Thread.currentThread().getName() + " start t1");
        threadA.start();
        try {
            System.out.println(Thread.currentThread().getName() + " call thread.join()");
            threadA.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " continue");
    }

    static class MyThread extends Thread {
        public MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + "---" + i);
            }
        }

    }
}

输出结果:
main start t1
main call thread.join()
t1---0
t1---1
t1---2
t1---3
t1---4
main continue

四、结果分析

主线程main会等待线程t1执行结束后继续执行

五、总结

  • join()方法本质上是通过wait()方法实现阻塞的
  • 如果子线程没有启动或者子线程执行结束,主线程不用等待可以继续执行

转载请注明作者及出处,并附上链接http://www.jianshu.com/u/ada8c4ee308b

相关文章

  • JAVA多线程09-基础篇-线程等待join

    本节摘要:join()的功能介绍,基本用法,源码分析,代码示例 一、功能介绍 join()使当前线程等待子线程执行...

  • Java 面试题

    java多线程实现主线程等待子线程执行完问题 1、使用Thread的join()方法,join()方法会阻塞主线程...

  • java多线程相关

    (一) 基础篇 01.Java多线程系列--“基础篇”01之 基本概念 02.Java多线程系列--“基础篇”02...

  • Android:多线程总结

    多线程总结 问题一:多线程join如何实现? join用来等待一个线程完成。join方法会调用wait函数,这个w...

  • Java多线程系列目录(共43篇)-转

    最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 Java多线程系列--“基础篇”0...

  • java并发工具类

    等待多线程完成 主线程等待所有线程完成工作 实现 thread.join()方法 原理 join 用于让当前执行线...

  • (三)线程的并发工具类

    Fork-Join java 下多线程的开发可以我们自己启用多线程,线程池,还可以使用fork-join ,for...

  • 并发

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

  • 多线程 | 基础

    第一章 多线程基础 join() 执行线程等待被调用线程执行完毕,才执行下步操作 yield() 当前线程让出cp...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

网友评论

    本文标题:JAVA多线程09-基础篇-线程等待join

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