關於線程join方法的理解 原

小弟 今天突發奇想,想着 把並行的線程 弄成串行的。。不關用什麼方法吧。反正實現了。但用到了 一個不常用的方法join。左思右想 ,終於還是覺得有必要做一次記錄。

首先 看下api:

大致理解爲,當前線程運行到這個方法時,會被掛起。而只有調用join方法的線程運行完畢 當前線程才繼續運行。

一個簡單的例子:

package com.thread;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Description:
 * @Date: create in 2018-07-11 15:54
 * @Author:Reynold-白
 */
public class ThreadTestJoin implements Runnable {
    private static AtomicInteger a;
    public ThreadTestJoin(){
        a = new AtomicInteger(0);
    }

    @Override
    public void run() {
        for(int i = 0; i < 5; i++){

            System.out.println("當前線程:" + Thread.currentThread().getName() + "a 的自增結果:" + a.get());
            a.getAndIncrement();
        }
    }

    /**
     * 當 t1調用join時,主線程暫停,t1繼續運行直到die 後main才繼續從join方法後執行。
     * 但再有個T2呢?
     *
     *
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        Thread t1 = new Thread(new ThreadTestJoin());
//        Thread t2 = new Thread(new ThreadTestJoin());
        t1.start();
        t1.join(); //等待線程 t1 終止  main才繼續 t2並未執行,這樣就是順序的了
//        t2.start();
//        t2.join();
        System.out.println();
        System.out.printf("主方法中輸出 a : %d\n", a.get());
    }

}

簡單解釋就是主線程執行到t1.join時,被掛起。知道t1運行完畢才執行下面的代碼。

運行結果:

當我把代碼中的註釋放開時運行結果是:

解釋:

因爲當主線程運行到t1.join時,t2還沒有啓動(還沒start呢!!),主線程就被掛起了。所以會有t1執行完再執行t2的這種結果,等t1執行完畢,主線程恢復,往下運行, 這是t2纔開始運行。

 

但如果再換種寫法呢:

運行結果:

結果顯示。。我的代碼中 那個a的值 初始化有些問題。。。。後期修改。尷尬。繼續看join

主線程在運行t1.join前已經將兩個線程啓動了(不一定那個線程獲取cpu資源多,有可能t2獲得資源多,先執行完畢就跟圖裏一樣,也有可能是t1先執行完畢,剩下的都是t2的信息,也有可能是交替的情況)。到了t1.join時,主線程被掛起,t2也會被掛起(如果t2還沒有執行完畢)。

那要怎麼實現串行呢,實現串行最直觀的方案是什麼呢?

其實 在run中在new 一個線程  再來一個類似遞歸的方法就可以了,這樣就能形成一個模型:

主線程調用T1  T1 調用T2  T2.join  T1會被掛起  T1.join  main會被掛起。這樣就是一個串行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章