愛睡覺的程序員

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            5 隨筆 :: 0 文章 :: 0 評論 :: 0 Trackbacks
               Semaphore,是用于控制一組線程訪問資源。舉個例子,老師上課,同學(xué)需要上廁所,老師準(zhǔn)備了3個令牌,拿到令牌的同學(xué)就可以去上廁所,上完廁所的同學(xué)需要歸還令牌。這樣就最多同時只有3名同學(xué)上廁所。這就是Semaphore的應(yīng)用場景。
              Semaphore的構(gòu)造函數(shù)可初始化令牌數(shù)量、是否公平鎖。如果是公平鎖,先申請令牌的可以先獲取。
              acquire() 和release()分別是獲取和釋放令牌,acquire(int) 和release(int) 分別是獲取和釋放多個令牌。
              例子實現(xiàn)如下:
          import java.util.Random;
          import java.util.concurrent.ExecutorService;
          import java.util.concurrent.Executors;
          import java.util.concurrent.Semaphore;
          import java.util.concurrent.TimeUnit;

          /**
           * Created by ganliang on 15/2/26.
           
          */
          public class SemaphoreTest {
              private static Semaphore semaphore = new Semaphore(3,true);
              public static void main(String[] args) {
                  ExecutorService executorService = Executors.newCachedThreadPool();

                  for (int i=0;i<10;i++){
                      executorService.submit(new Student("學(xué)生"+i));
                  }
                  executorService.shutdown();
              }
              static class Student implements Runnable{
                  private String name;
                  public Student(String name){
                      this.name = name;
                  }
                  @Override
                  public void run() {
                      try {
                          semaphore.acquire();
                          System.out.println(name+"拿到令牌,上廁所");
                          TimeUnit.SECONDS.sleep(new Random().nextInt(10));
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                      semaphore.release();
                      System.out.println(name+"歸還令牌,上課");
                  }
              }
          }
          posted on 2015-02-26 18:10 polang 閱讀(438) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 贵港市| 银川市| 胶州市| 清涧县| 安平县| 昂仁县| 偃师市| 福泉市| 呼玛县| 宣城市| 禄丰县| 桃园市| 邳州市| 浦江县| 望城县| 颍上县| 湘乡市| 饶河县| 嘉义县| 开远市| 甘孜县| 蒙山县| 淮北市| 博湖县| 盐源县| 张家港市| 新河县| 青神县| 抚宁县| 雅安市| 霸州市| 梓潼县| 乌苏市| 独山县| 娄烦县| 龙泉市| 鹿邑县| 威远县| 兴文县| 营山县| 深圳市|