官术网_书友最值得收藏!

1.1.3 方法acquire(int permits)參數作用及動態添加permits許可數量

有參方法acquire(int permits)的功能是每調用1次此方法,就使用x個許可。

創建Java項目,名稱為Semaphore_acquire(int permits)_release(int permits),創建類Service.java代碼如下:


        package service;
        import java.util.concurrent.Semaphore;
        public class Service {
            private Semaphore semaphore = new Semaphore(10);
            public void testMethod() {
                try {
                    semaphore.acquire(2);
                  System.out.println(Thread.currentThread().getName()
                          + " begin timer=" + System.currentTimeMillis());
                  int sleepValue = ((int) (Math.random() * 10000));
                  System.out.println(Thread.currentThread().getName() + " 停止了"
                          + (sleepValue / 1000) + "秒");
                  Thread.sleep(sleepValue);
                  System.out.println(Thread.currentThread().getName()
                          + "    end timer=" + System.currentTimeMillis());
                  semaphore.release(2);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      }

線程類ThreadA.java代碼如下:


      package extthread;
      import service.Service;
      public class ThreadA extends Thread {
          private Service service;
          public ThreadA(Service service) {
              super();
              this.service = service;
          }
          @Override
          public void run() {
              service.testMethod();
          }
      }

類Run.java代碼如下:


      package test;
      import service.Service;
      import extthread.ThreadA;
      public class Run {
          public static void main(String[] args) throws InterruptedException {
              Service service = new Service();
              ThreadA[] a = new ThreadA[10];
              for (int i = 0; i < 10; i++) {
                  a[i] = new ThreadA(service);
                        a[i].start();
                    }
                }
            }

程序運行效果如圖1-7所示。

圖1-7 運行結果

在代碼中一共有10個許可,每次執行semaphore. acquire(2);代碼時耗費掉2個,所以10/2=5,說明同一時間只有5個線程允許執行acquire()和release()之間的代碼。

如果多次調用Semaphore類的release()或release(int)方法時,還可以動態增加permits的個數。

創建測試用的項目addPermitsCount,類Run.java代碼如下:


              package test;
              import java.util.concurrent.Semaphore;
              public class Run {
                  public static void main(String[] args) {
                      try {
                          Semaphore semaphore = new Semaphore(5);
                          semaphore.acquire();
                          semaphore.acquire();
                          semaphore.acquire();
                          semaphore.acquire();
                          semaphore.acquire();
                          System.out.println(semaphore.availablePermits());
                          semaphore.release();
                          semaphore.release();
                          semaphore.release();
                          semaphore.release();
                          semaphore.release();
                          semaphore.release();
                          System.out.println(semaphore.availablePermits());
                          semaphore.release(4);
                          System.out.println(semaphore.availablePermits());
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
              }

程序運行后的效果如圖1-8所示。

圖1-8 成功動態添加許可

此實驗說明構造參數new Semaphore(5);中的5并不是最終的許可數量,僅僅是初始的狀態值。

主站蜘蛛池模板: 吕梁市| 府谷县| 阳原县| 疏附县| 富平县| 平潭县| 宝应县| 德令哈市| 泸州市| 蓝山县| 沛县| 纳雍县| 白城市| 申扎县| 梅州市| 依安县| 施秉县| 新化县| 太和县| 巴楚县| 翁牛特旗| 信阳市| 库尔勒市| 南澳县| 庆阳市| 定边县| 冀州市| 咸丰县| 涿州市| 诏安县| 广东省| 万盛区| 会泽县| 江北区| 雷波县| 突泉县| 和龙市| 乐山市| 吴忠市| 灵丘县| 江油市|