線程join方法 小demo
阿新 • • 發佈:2017-12-08
start class implement 強制 system main方法 完成後 thread 改變
1.第一個示例:
1 package cn.threaddemo; 2 3 public class T implements Runnable { 4 5 public static int a = 0; 6 7 @Override 8 public void run() { 9 System.out.print("t線程中的a:"); 10 for (int k = 0; k < 5; k++) { 11 a = a + 1; 12 System.out.print(" "+a);13 } 14 } 15 16 public static void main(String[] args) throws Exception { 17 Runnable r = new T(); 18 Thread t = new Thread(r); 19 t.start(); 20 /* */ 21 System.out.println("主線程中的a:"+a); 22 } 23 24 }
輸出結果:
主線程中的a:0
t線程中的a: 1 2 3 4 5
這是因為,當主線程 main方法執行 System.out.println("主線程中的a:"+a); 這條語句時,t 線程還沒有真正開始運行,或許正在為它分配資源準備運行。因為為線程分配資源需要時間,而main方法執行完t.start()方法後繼續往下執行System.out.println(a); 這個時候得到的結果是a還沒有被改變的值0 。
2.Question: 怎樣才能讓主線程中的輸出結果為5, join() 方法提供了這種功能,在第一個代碼的基礎上進行修改如下:
1 package cn.threaddemo; 2 3 public class T1 implements Runnable { 4 5 public static int a = 0; 6 7 @Override 8 public void run() { 9 System.out.print("t線程中的a:"); 10 for (int k = 0; k < 5; k++) {11 a = a + 1; 12 System.out.print(" "+a); 13 } 14 } 15 16 public static void main(String[] args) throws Exception { 17 Runnable r = new T1(); 18 Thread t = new Thread(r); 19 t.start(); 20 t.join();//把線程t強制合並到主線程,使兩個線程順序執行,t線程執行完成後,再接著執行主線程 21 System.out.println("\n主線程中的a:"+a); 22 } 23 24 25 }
執行結果如下:
分析:thread.Join()方法把指定的線程加入到當前線程,可以將兩個交替執行的線程合並為順序執行的線程。 比如在線程B中調用了線程A的Join()方法,直到線程A執行完畢後,才會繼續執行線程B。
第一個示例中t線程和主線程是交替運行,當主線程中加入t.join();語句後,線程執行順序變成了:先執行線程t, t線程執行結束後再接著執行主線程,由原來的線程交替並行執行變成了順序執行。
3. 另外一種方式實現主線程中輸出5:讓主線程休眠一定時間,這種方式不能保證t線程一定會比主線程先執行完,當主線程設置休眠時間比較長時,可以保證t線程先於主線程完成
當主線程設置休眠時間比較短時,就不一定能保證了
線程join方法 小demo