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

1.1.1 類Semaphore的同步性
多線程中的同步概念其實就是排著隊去執行一個任務,執行任務是一個一個執行,并不能并行執行,這樣的優點是有助于程序邏輯的正確性,不會出現非線程安全問題,保證軟件系統功能上的運行穩定性。
那么本節就使用一個初步的案例來看看Semaphore類是如何實現限制線程并發數的。
創建實驗用的項目SemaphoreTest1,類Service.java代碼如下:
package service; import java.util.concurrent.Semaphore; public class Service { private Semaphore semaphore = new Semaphore(1); public void testMethod() { try { semaphore.acquire(); System.out.println(Thread.currentThread().getName() + " begin timer=" + System.currentTimeMillis()); Thread.sleep(5000); System.out.println(Thread.currentThread().getName() + " end timer=" + System.currentTimeMillis()); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }
類Semaphore的構造函數參數permits是許可的意思,代表同一時間內,最多允許多少個線程同時執行acquire()和release()之間的代碼。
無參方法acquire()的作用是使用1個許可,是減法操作。
創建3個線程類如圖1-3所示。

圖1-3 線程數量為3
運行類Run.java代碼如下:
package test; import service.Service; import extthread.ThreadA; import extthread.ThreadB; import extthread.ThreadC; public class Run { public static void main(String[] args) { Service service = new Service(); ThreadA a = new ThreadA(service); a.setName("A"); ThreadB b = new ThreadB(service); b.setName("B"); ThreadC c = new ThreadC(service); c.setName("C"); a.start(); b.start(); c.start(); } }
程序運行后的效果如圖1-4所示。

圖1-4 同步運行了
說明使用代碼:
private Semaphore semaphore = new Semaphore(1);
來定義最多允許1個線程執行acquire()和release()之間的代碼,所以打印的結果就是3個線程是同步的。
推薦閱讀
- Advanced Quantitative Finance with C++
- 嵌入式軟件系統測試:基于形式化方法的自動化測試解決方案
- Boost C++ Application Development Cookbook(Second Edition)
- AWS Serverless架構:使用AWS從傳統部署方式向Serverless架構遷移
- Java EE框架整合開發入門到實戰:Spring+Spring MVC+MyBatis(微課版)
- Quarkus實踐指南:構建新一代的Kubernetes原生Java微服務
- Java EE 8 Application Development
- 51單片機C語言開發教程
- 劍指大數據:企業級數據倉庫項目實戰(在線教育版)
- Node Cookbook(Second Edition)
- 持續輕量級Java EE開發:編寫可測試的代碼
- Mastering Apache Storm
- JavaScript機器人編程指南
- Raspberry Pi開發實戰
- Python程序設計:基礎與實踐