小弟 今天突發奇想,想着 把並行的線程 弄成串行的。。不關用什麼方法吧。反正實現了。但用到了 一個不經常使用的方法join。冥思苦想 ,終於仍是以爲有必要作一次記錄。java
首先 看下api:api
大體理解爲,當前線程運行到這個方法時,會被掛起。而只有調用join方法的線程運行完畢 當前線程才繼續運行。ide
一個簡單的例子:atom
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運行完畢才執行下面的代碼。線程
運行結果:blog
當我把代碼中的註釋放開時運行結果是:遞歸
解釋:ip
由於當主線程運行到t1.join時,t2尚未啓動(還沒start呢!!),主線程就被掛起了。因此會有t1執行完再執行t2的這種結果,等t1執行完畢,主線程恢復,往下運行, 這是t2纔開始運行。資源
但若是再換種寫法呢:rem
運行結果:
結果顯示。。個人代碼中 那個a的值 初始化有些問題。。。。後期修改。尷尬。繼續看join
主線程在運行t1.join前已經將兩個線程啓動了(不必定那個線程獲取cpu資源多,有可能t2得到資源多,先執行完畢就跟圖裏同樣,也有多是t1先執行完畢,剩下的都是t2的信息,也有多是交替的狀況)。到了t1.join時,主線程被掛起,t2也會被掛起(若是t2尚未執行完畢)。
那要怎麼實現串行呢,實現串行最直觀的方案是什麼呢?
其實 在run中在new 一個線程 再來一個相似遞歸的方法就能夠了,這樣就能造成一個模型:
主線程調用T1 T1 調用T2 T2.join T1會被掛起 T1.join main會被掛起。這樣就是一個串行了。