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

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

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

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

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

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

          1.  測(cè)試1

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

          java mythread.JoinThread

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

          n=442

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

          2.  測(cè)試2

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

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

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

          n=1000

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

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





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

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



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


          新浪微博:http://t.sina.com.cn/androidguy   昵稱(chēng):李寧_Lining

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

          評(píng)論

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

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

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

          感謝博主的分享

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

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

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

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

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

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

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

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

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

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

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

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

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

          @fwy
          研究了一個(gè)volatile,知道為什么會(huì)不同步了,詳見(jiàn)下面的文章:
          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ù)  更多評(píng)論   

          個(gè)人覺(jué)得作者沒(méi)有深入線程的底層去說(shuō)明問(wèn)題
          2009-03-16 13:23 | guming123416

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

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

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

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

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

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

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

          測(cè)試二的命令怎么看不到
          2014-05-29 23:30 | swew
          主站蜘蛛池模板: 开江县| 丰镇市| 阿荣旗| 资溪县| 昌邑市| 南汇区| 象州县| 达拉特旗| 疏勒县| 手机| 兰西县| 平舆县| 通渭县| 嘉定区| 武宁县| 荥阳市| 永福县| 蓝田县| 阿坝县| 陕西省| 霍邱县| 舒兰市| 秀山| 高雄市| 额敏县| 全州县| 仪征市| 同心县| 阜阳市| 昆明市| 监利县| 奇台县| 东宁县| 华坪县| 科技| 鄂托克前旗| 吉隆县| 鄂尔多斯市| 防城港市| 乃东县| 定边县|