JAVA线程协作:join()方法

一、Join解释

Java对Thread的Join方法解释:等待当前线程终止。

public final void join() throws [InterruptedException]
Waits for this thread to die.

二、Demo

案例是一个计算两个线程执行完毕后的时间统计。那么我们怎样确定两个线程是否已经执行完毕呢?
可以通过线程Thread的Join方法来确定当前的线程是否已经执行完毕。

    final long objSize = 100;

    private final static LinkedBlockingDeque<CompareDemoObj> queue = new LinkedBlockingDeque<>();
    
    public void Join() throws InterruptedException{
        Thread product = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < objSize; i++) {
                    try {
                        queue.add( new CompareDemoObj());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }) ;
        
        Thread consumer = new Thread(new Runnable() {
            @Override
            public void run() {
                if(queue.size()>0){
                       queue.remove();
                }
            }
        });
        long timeStart = System.currentTimeMillis();
        product.start();
        consumer.start();
        product.join();
        consumer.join();
        long timeEnd = System.currentTimeMillis();
        System.out.println((timeEnd - timeStart));
    }

三、Join是怎样确定线程是否已经完成

1.我们查看下Join方法的源码是调用Join(0)的方法:

    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方法,使主线程进入了等待的状态,待子线程唤醒主线程,主线程在继续执行。

四、执行过程

捕获.PNG

参考:
https://docs.oracle.com/javase/8/docs/api/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • join 是Thread 的方法。 阻塞当前线程,等待到该线程结束,才开始执行后面语句。Join之后类似于Java...
    Alien的小窝阅读 4,367评论 0 2
  • 重点:1.join()的作用是让“主线程”等待“子线程”结束之后才能继续运行2.wait()的作用是让“当前线程”...
    堤岸小跑阅读 5,882评论 0 0
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,092评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,198评论 1 15
  • 一、认识多任务、多进程、单线程、多线程 要认识多线程就要从操作系统的原理说起。 以前古老的DOS操作系统(V 6....
    GT921阅读 4,605评论 0 3