愛睡覺的程序員

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            5 隨筆 :: 0 文章 :: 0 評論 :: 0 Trackbacks
               Semaphore,是用于控制一組線程訪問資源。舉個例子,老師上課,同學需要上廁所,老師準備了3個令牌,拿到令牌的同學就可以去上廁所,上完廁所的同學需要歸還令牌。這樣就最多同時只有3名同學上廁所。這就是Semaphore的應用場景。
              Semaphore的構造函數可初始化令牌數量、是否公平鎖。如果是公平鎖,先申請令牌的可以先獲取。
              acquire() 和release()分別是獲取和釋放令牌,acquire(int) 和release(int) 分別是獲取和釋放多個令牌。
              例子實現如下:
          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("學生"+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)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 龙胜| 蓬安县| 岚皋县| 双江| 始兴县| 建昌县| 万山特区| 绥宁县| 正镶白旗| 太仆寺旗| 江达县| 喀什市| 奉化市| 绥宁县| 灵川县| 犍为县| 仁化县| 吉安县| 上饶县| 梅河口市| 康保县| 五台县| 芷江| 威信县| 吉安市| 灵丘县| 阆中市| 通化县| 乡城县| 鄂托克前旗| 健康| 蓝山县| 伊通| 汪清县| 荆门市| 黔江区| 达尔| 靖宇县| 金寨县| 茂名市| 苍梧县|