Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          線程--CyclicBarrier

          Posted on 2009-12-23 23:38 啥都寫點(diǎn) 閱讀(1783) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE

              本例介紹第三個(gè)同步裝置:CyclicBarrier,它維護(hù)一個(gè)計(jì)數(shù)器,與CountDownLatch不同的是,等待這個(gè)CyclicBarrier的線程必須等到計(jì)數(shù)器到達(dá)某個(gè)值時(shí),才可以繼續(xù)。CyclicBarrier就像它名字的意思一樣,可看成是個(gè)障礙,所有的線程必須到齊后才能一起通過這個(gè)障礙。本例實(shí)現(xiàn)一個(gè)數(shù)組相鄰元素的加法,一個(gè)線程給數(shù)組的第一個(gè)元素賦值,然后等待其他線程給數(shù)組第二個(gè)元素賦值,然后將第一個(gè)元素和第二個(gè)元素相加。


                 構(gòu)造CyclicBarrier對(duì)象時(shí),需要指定計(jì)數(shù)器的目標(biāo)值,計(jì)數(shù)器的初始值為0.還可以在構(gòu)造方法中帶一個(gè)Runnable參數(shù),表示當(dāng)計(jì)數(shù)器到達(dá)目標(biāo)值時(shí),在等待CyclicBarrier的線程被喚醒之前,指定該Runnable任務(wù)。
                 CyclicBarrier的await方法使當(dāng)前線程進(jìn)入等待狀態(tài),計(jì)數(shù)器加1,當(dāng)計(jì)數(shù)器到達(dá)目標(biāo)值時(shí),當(dāng)前線程被喚醒。


          import java.util.Random;
          import java.util.concurrent.CyclicBarrier;

          /**
           * CyclicBarrier類似于CountDownLatch也是個(gè)計(jì)數(shù)器,
           * 不同的是CyclicBarrier數(shù)的是調(diào)用了CyclicBarrier.await()進(jìn)入等待的線程數(shù),
           * 當(dāng)線程數(shù)達(dá)到了CyclicBarrier初始時(shí)規(guī)定的數(shù)目時(shí),所有進(jìn)入等待狀態(tài)的線程被喚醒并繼續(xù)。
           * CyclicBarrier就象它名字的意思一樣,可看成是個(gè)障礙,
           * 所有的線程必須到齊后才能一起通過這個(gè)障礙。
           * CyclicBarrier初始時(shí)還可帶一個(gè)Runnable的參數(shù),
           * 此Runnable任務(wù)在CyclicBarrier的數(shù)目達(dá)到后,所有其它線程被喚醒前被執(zhí)行。
           
          */

          public class CyclicBarrierTest {

              
          public static class ComponentThread implements Runnable {
                  CyclicBarrier barrier;
          // 計(jì)數(shù)器
                  int ID;    // 組件標(biāo)識(shí)
                  int[] array;    // 數(shù)據(jù)數(shù)組

                  
          // 構(gòu)造方法
                  public ComponentThread(CyclicBarrier barrier, int[] array, int ID) {
                      
          this.barrier = barrier;
                      
          this.ID = ID;
                      
          this.array = array;
                  }


                  
          public void run() {
                      
          try {
                          array[ID] 
          = new Random().nextInt(100);
                          System.out.println(
          "Component " + ID + " generates: " + array[ID]);
                          
          // 在這里等待Barrier處
                          System.out.println("Component " + ID + " sleep");
                          barrier.await();
                          System.out.println(
          "Component " + ID + " awaked");
                          
          // 計(jì)算數(shù)據(jù)數(shù)組中的當(dāng)前值和后續(xù)值
                          int result = array[ID] + array[ID + 1];
                          System.out.println(
          "Component " + ID + " result: " + result);
                      }
           catch (Exception ex) {
                      }

                  }

              }

              
          /**
               * 測(cè)試CyclicBarrier的用法
               
          */

              
          public static void testCyclicBarrier() {
                  
          final int[] array = new int[3];
                  CyclicBarrier barrier 
          = new CyclicBarrier(2new Runnable() {
                      
          // 在所有線程都到達(dá)Barrier時(shí)執(zhí)行
                      public void run() {
                          System.out.println(
          "testCyclicBarrier run");
                          array[
          2= array[0+ array[1];
                      }

                  }
          );

                  
          // 啟動(dòng)線程
                  new Thread(new ComponentThread(barrier, array, 0)).start();
                  
          new Thread(new ComponentThread(barrier, array, 1)).start();
              }


              
          public static void main(String[] args) {
                  CyclicBarrierTest.testCyclicBarrier();
              }

          }



                                                                                                                 --    學(xué)海無涯
                  

          主站蜘蛛池模板: 孝昌县| 普洱| 民乐县| 房产| 崇信县| 松溪县| 大洼县| 乌苏市| 彭州市| 石景山区| 泸西县| 唐海县| 桃源县| 昌平区| 光山县| 桂东县| 玛沁县| 库伦旗| 肇东市| 芒康县| 茂名市| 德庆县| 治县。| 崇左市| 洱源县| 扎赉特旗| 莎车县| 平塘县| 侯马市| 河北省| 隆昌县| 古田县| 白朗县| 蛟河市| 三原县| 博湖县| 乌兰浩特市| 阿坝县| 西乌| 潞城市| 福鼎市|