java并发编程之Semaphore
1.Semaphore主要方法
Semaphore(int permits):構(gòu)造方法,創(chuàng)建具有給定許可數(shù)的計數(shù)信號量并設(shè)置為非公平信號量。
Semaphore(int permits,boolean fair):構(gòu)造方法,當fair等于true時,創(chuàng)建具有給定許可數(shù)的計數(shù)信號量并設(shè)置為公平信號量。
void acquire():從此信號量獲取一個許可前線程將一直阻塞。相當于一輛車占了一個車位。
void acquire(int n):從此信號量獲取給定數(shù)目許可,在提供這些許可前一直將線程阻塞。比如n=2,就相當于一輛車占了兩個車位。
void release():釋放一個許可,將其返回給信號量。就如同車開走返回一個車位。
void release(int n):釋放n個許可。
int availablePermits():當前可用的許可數(shù)。
2.示例
Semaphore(信號量)是用來控制同時訪問特定資源的線程數(shù)量,它通過協(xié)調(diào)各個線程,以保證合理的使用公共資源。
比如一個火車站,只有3個售票點,所以要控制流量。假設(shè)有10個人要買票,現(xiàn)在只允許3個人同時去對應(yīng)的售票點買票,只有這3個人中有人完成了購票操作,后面的人才能允許進入。
public class SemaphoreDemo extends Thread {private Semaphore semaphore;private String name; ?public SemaphoreDemo(Semaphore semaphore, String name) {this.semaphore = semaphore;this.name = name;} ?@Overridepublic void run() {//返回此信號量中當前可用的許可證數(shù)int i = semaphore.availablePermits();if (i > 0) {System.out.println(name + ":我有搶票的資格了");} else {System.out.println(name + ":好可惜啊");} ?try {//獲得許可證semaphore.acquire();System.out.println(name + ":我要開搶了");//模擬搶票時間Thread.sleep(new Random().nextInt(1000));System.out.println(name + ":終于搶到票了");} catch (InterruptedException e) {e.printStackTrace();} finally {//釋放許可證semaphore.release();}} ?public static void main(String[] args) {Semaphore s = new Semaphore(3);for (int i = 1; i <= 10; i++) {SemaphoreDemo semaphore = new SemaphoreDemo(s, i + "");semaphore.start();}} } 在代碼中,雖然有10個線程在執(zhí)行,但是只允許3個并發(fā)的執(zhí)行。執(zhí)行流程:
1:我有搶票的資格了 1:我要開搶了 2:我有搶票的資格了 2:我要開搶了 3:我有搶票的資格了 3:我要開搶了 4:好可惜啊 5:好可惜啊 6:好可惜啊 7:好可惜啊 8:好可惜啊 9:好可惜啊 10:好可惜啊 2:終于搶到票了 4:我要開搶了 3:終于搶到票了 5:我要開搶了 5:終于搶到票了 6:我要開搶了 1:終于搶到票了 7:我要開搶了 4:終于搶到票了 8:我要開搶了 8:終于搶到票了 9:我要開搶了 7:終于搶到票了 10:我要開搶了 10:終于搶到票了 9:終于搶到票了 6:終于搶到票了總結(jié)
以上是生活随笔為你收集整理的java并发编程之Semaphore的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot实现监控linux
- 下一篇: java使用POI工具类导出excel