1. 程式人生 > >線程join方法 小demo

線程join方法 小demo

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