- Java并發編程:核心方法與框架
- 高洪巖
- 453字
- 2019-01-03 02:34:13

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并不是最終的許可數量,僅僅是初始的狀態值。
推薦閱讀
- Cocos2d Cross-Platform Game Development Cookbook(Second Edition)
- Boost程序庫完全開發指南:深入C++”準”標準庫(第5版)
- 自制編譯器
- Visual Basic 6.0程序設計計算機組裝與維修
- HTML5 移動Web開發從入門到精通(微課精編版)
- Python完全自學教程
- Mastering ServiceNow(Second Edition)
- Linux Device Drivers Development
- Learning FuelPHP for Effective PHP Development
- Python語言實用教程
- Java Web從入門到精通(第3版)
- C語言程序設計實訓教程與水平考試指導
- 新印象:解構UI界面設計
- 微課學人工智能Python編程
- 從程序員角度學習數據庫技術(藍橋杯軟件大賽培訓教材-Java方向)