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

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

          本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

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

              在上面的例子中多次使用到了Thread類的join方法。我想大家可能已經(jīng)猜出來join方法的功能是什么了。對,join方法的功能就是使異步執(zhí)行的線程變成同步執(zhí)行。也就是說,當(dāng)調(diào)用線程實(shí)例的start方法后,這個方法會立即返回,如果在調(diào)用start方法后后需要使用一個由這個線程計算得到的值,就必須使用join方法。如果不使用join方法,就不能保證當(dāng)執(zhí)行到start方法后面的某條語句時,這個線程一定會執(zhí)行完。而使用join方法后,直到這個線程退出,程序才會往下執(zhí)行。下面的代碼演示了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);  // 為了使運(yùn)行結(jié)果更隨機(jī),延遲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++)   // 運(yùn)行剛才建立的100個線程
                      threads[i].start();
                  
          if (args.length > 0)  
                      
          for (int i = 0; i < threads.length; i++)   // 100個線程都執(zhí)行完后繼續(xù)
                          threads[i].join();
                  System.out.println(
          "n=" + JoinThread.n);
              }
          }

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

          1.  測試1

          使用如下的命令運(yùn)行上面程序:

          java mythread.JoinThread

          程序的運(yùn)行結(jié)果如下:

          n=442

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

          2.  測試2

          使用如下的命令運(yùn)行上面的代碼:

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

          程序的運(yùn)行結(jié)果如下:

          n=1000

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

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





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

          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 銀河使者 閱讀(5997) 評論(14)  編輯  收藏 所屬分類: java 原創(chuàng)多線程

          評論

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

          學(xué)習(xí)了。
          2009-03-12 11:03 | 免費(fèi)打電話

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

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

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

          我曾經(jīng)也想學(xué)JAVA來著,但學(xué)不會。哈哈。
          2009-03-12 11:06 | 同志會所

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          博主,終于找到原創(chuàng)出處了。。。轉(zhuǎn)載的基本都是錯的!
          2014-03-28 18:04 | yuanyuan

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

          測試二的命令怎么看不到
          2014-05-29 23:30 | swew
          主站蜘蛛池模板: 乐陵市| 巨鹿县| 泾川县| 梁山县| 佛学| 玉环县| 宁乡县| 巴东县| 山东| 德州市| 丰城市| 前郭尔| 乳源| 麻阳| 息烽县| 勃利县| 牟定县| 朔州市| 青海省| 丹棱县| 广州市| 嘉禾县| 库伦旗| 额敏县| 浮山县| 大荔县| 旬邑县| 石狮市| 东乌珠穆沁旗| 嘉兴市| 太谷县| 衡阳市| 泾川县| 辽宁省| 义马市| 老河口市| 和顺县| 德清县| 宣城市| 临朐县| 西华县|