美文网首页
JAVA线程协作:join()方法

JAVA线程协作:join()方法

作者: barry_di | 来源:发表于2017-11-07 16:41 被阅读0次

一、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/

相关文章

  • JAVA线程协作:join()方法

    一、Join解释 Java对Thread的Join方法解释:等待当前线程终止。 二、Demo 案例是一个计算两个线...

  • Java 面试题

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

  • Java Thread Join

    英文原文:Java Thread Join Example Java Thread join 方法可以当前的线程暂...

  • JAVA 笔记[12.2][多线程之 join]

    join join 方法有三种重载方式 join 线程 JoinLearn.java 运行

  • Java线程协作基础 wait/notify+await/sig

    Java线程协作 [TOC] 线程协作的基本方法:wait/notify/notifyAll和await/sign...

  • java线程join方法使用方法简介

    本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执...

  • Python & Java 多线程Join方法

    join 是Thread 的方法。 阻塞当前线程,等待到该线程结束,才开始执行后面语句。Join之后类似于Java...

  • java控制线程(一)

    java控制线程(一) java的线程支持提供了一些便捷的工具方法: join线程:Thread提供了让一个线程等...

  • Java 线程协作wait()、sleep()、join()

    起因 近日在复习线程相关的知识,在join()方法有些遗忘,查看网上的各种文章也多有纰漏、错误,所以做一下记录,备...

  • 高并发知识(四)

    在Java中,线程(Thread)的合并流程是:假设线程A调用了线程B的B.join方法,合并B线程。那么,线程A...

网友评论

      本文标题:JAVA线程协作:join()方法

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