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/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • join 是Thread 的方法。 阻塞當前線程,等待到該線程結束,才開始執行后面語句。Join之后類似于Java...
    Alien的小窩閱讀 859評論 0 2
  • 重點:1.join()的作用是讓“主線程”等待“子線程”結束之后才能繼續運行2.wait()的作用是讓“當前線程”...
    堤岸小跑閱讀 1,920評論 0 0
  • Java多線程學習 [-] 一擴展javalangThread類 二實現javalangRunnable接口 三T...
    影馳閱讀 2,986評論 1 18
  • 本文主要講了java中多線程的使用方法、線程同步、線程數據傳遞、線程狀態及相應的一些線程函數用法、概述等。 首先講...
    李欣陽閱讀 2,493評論 1 15
  • 一、認識多任務、多進程、單線程、多線程 要認識多線程就要從操作系統的原理說起。 以前古老的DOS操作系統(V 6....
    GT921閱讀 1,024評論 0 3