隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          Java多線程初學者指南(5):join方法的使用

          本文為原創,如需轉載,請注明作者和出處,謝謝!

          上一篇:Java多線程初學者指南(4):線程的生命周期

              在上面的例子中多次使用到了Thread類的join方法。我想大家可能已經猜出來join方法的功能是什么了。對,join方法的功能就是使異步執行的線程變成同步執行。也就是說,當調用線程實例的start方法后,這個方法會立即返回,如果在調用start方法后后需要使用一個由這個線程計算得到的值,就必須使用join方法。如果不使用join方法,就不能保證當執行到start方法后面的某條語句時,這個線程一定會執行完。而使用join方法后,直到這個線程退出,程序才會往下執行。下面的代碼演示了join的用法。
          package mythread;

          public class JoinThread extends Thread
          {
              
          public static int n = 0;

              
          static synchronized void inc()
              {
                  n
          ++;
              }
              
          public void run()
              {
                  
          for (int i = 0; i < 10; i++)
                      
          try
                      {
                          inc();
                          sleep(
          3);  // 為了使運行結果更隨機,延遲3毫秒
                          
                      }
                      
          catch (Exception e)
                      {
                      }                                      
              }
              
          public static void main(String[] args) throws Exception
              {
             
                  Thread threads[] 
          = new Thread[100];
                  
          for (int i = 0; i < threads.length; i++)  // 建立100個線程
                      threads[i] = new JoinThread();
                  
          for (int i = 0; i < threads.length; i++)   // 運行剛才建立的100個線程
                      threads[i].start();
                  
          if (args.length > 0)  
                      
          for (int i = 0; i < threads.length; i++)   // 100個線程都執行完后繼續
                          threads[i].join();
                  System.out.println(
          "n=" + JoinThread.n);
              }
          }

          在例程2-8中建立了100個線程,每個線程使靜態變量n增加10。如果在這100個線程都執行完后輸出n,這個n值應該是1000

          1.  測試1

          使用如下的命令運行上面程序:

          java mythread.JoinThread

          程序的運行結果如下:

          n=442

          這個運行結果可能在不同的運行環境下有一些差異,但一般n不會等于1000。從上面的結果可以肯定,這100個線程并未都執行完就將n輸出了。

          2.  測試2

          使用如下的命令運行上面的代碼:

              在上面的命令行中有一個參數join,其實在命令行中可以使用任何參數,只要有一個參數就可以,這里使用join,只是為了表明要使用join方法使這100個線程同步執行。

          程序的運行結果如下:

          n=1000

             無論在什么樣的運行環境下運行上面的命令,都會得到相同的結果:n=1000。這充分說明了這100個線程肯定是都執行完了,因此,n一定會等于1000

          下一篇:
          Java多線程初學者指南(6):慎重使用volatile關鍵字





          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-03-12 09:07 銀河使者 閱讀(5998) 評論(14)  編輯  收藏 所屬分類: java 原創多線程

          評論

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          學習了。
          2009-03-12 11:03 | 免費打電話

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          感謝博主的分享
          2009-03-12 11:04 | 數據庫審計

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          我曾經也想學JAVA來著,但學不會。哈哈。
          2009-03-12 11:06 | 同志會所

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          在我這里運行測試二的時候結果不是1000
          997,993的樣子
          2009-03-12 23:36 | fwy

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          @fwy
          我測試了一下,這個volatile關鍵字好象不能真正的同步,看來得使用synchronized關鍵字了,程序改了一下,加了synchronized 關鍵字,這回結果一定是1000。
          2009-03-13 08:33 | 銀河使者

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          昨天這個程序我也看了很久,是在沒想明白為什么聲明了n是volatile但是最后計算結果就是少那么幾個數,基本50%幾率都不會是1000
          2009-03-13 18:26 | fwy

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          @fwy
          我現在用的是jdk6,這個程序是很久以前寫的,用的是jdk1.4,當時測的時候好象是對的,不會是jdk的原因吧!暈,誰知道是怎么回事,請跟貼。
          2009-03-13 19:24 | 銀河使者

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          就是public static int n = 0;加上volatile關鍵字為什么還不能同步?
          2009-03-13 19:25 | 銀河使者

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          @fwy
          研究了一個volatile,知道為什么會不同步了,詳見下面的文章:
          Java多線程初學者指南(6):慎重使用volatile關鍵字
          http://www.aygfsteel.com/nokiaguy/archive/2009/03/14/259733.html
          2009-03-14 16:48 | 銀河使者

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          個人覺得作者沒有深入線程的底層去說明問題
          2009-03-16 13:23 | guming123416

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          @guming123416
          哈哈,這是初學者指南,并沒有講得太深,如果想深入研究,可以反編譯.class文件生成bytecode,一目了然!
          本文只給出了結果而已!
          2009-03-16 13:51 | 銀河使者

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          為啥我執行join的結果都在1949以上?
          2014-03-28 17:58 | yuanyuan

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          博主,終于找到原創出處了。。。轉載的基本都是錯的!
          2014-03-28 18:04 | yuanyuan

          # re: Java多線程初學者指南(5):join方法的使用  回復  更多評論   

          測試二的命令怎么看不到
          2014-05-29 23:30 | swew
          主站蜘蛛池模板: 扎赉特旗| 台南市| 开原市| 城固县| 德化县| 都江堰市| 枝江市| 曲阳县| 德昌县| 绩溪县| 台山市| 色达县| 桦甸市| 宜都市| 蒲江县| 平遥县| 连江县| 蓬溪县| 平塘县| 夹江县| 鞍山市| 赣榆县| 延寿县| 闵行区| 额尔古纳市| 商洛市| 昭觉县| 安徽省| 阿坝| 巩留县| 叶城县| 吉首市| 含山县| 嘉义县| 遵义县| 津南区| 常州市| 余庆县| 延长县| 河北省| 阳高县|