Java多執行緒——Semaphore
Semaphore
Semaphore(訊號量)是用來控制同時訪問特定資源的執行緒數量,它通過協調各個執行緒,以保證合理的使用公共資源。
一個計數訊號量。從概念上講,訊號量維護了一個許可集。如有必要,在許可可用前會阻塞每一個 acquire(),然後再獲取該許可。每個 release() 新增一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可物件,Semaphore 只對可用許可的號碼進行計數,並採取相應的行動。拿到訊號量的執行緒可以進入程式碼,否則就等待。通過acquire()和release()獲取和釋放訪問許可。
常用方法
Semaphore(int permits, boolean fair) 可以設定該訊號量是否採用公平模式,如果以公平方式執行,則執行緒將會按到達的順序(FIFO)執行,如果是非公平,則可以後請求的有可能排在佇列的頭部。
int availablePermits() :返回此訊號量中當前可用的許可證數。
int getQueueLength():返回正在等待獲取許可證的執行緒數。
boolean hasQueuedThreads() :是否有執行緒正在等待獲取許可證。
示例
用10個執行緒執行,通過訊號量控制只允許3個併發的執行。
public class SemaphorePractice {
public void semaphorePrac(){
Semaphore semaphore = new Semaphore(3);
ExecutorService executorService = Executors.newFixedThreadPool(10);
for(int i = 0; i < 10; i++){
executorService.execute(new Runnable(){
public void run(){
try {
semaphore.acquire();
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + " is working");
semaphore.release();
}
});
}
executorService.shutdown();
}
public static void main(String[] args){
SemaphorePractice semaphorePractice = new SemaphorePractice();
semaphorePractice.semaphorePrac();
}
}
從執行結果中可以看到,因為中間睡眠了2秒,會每兩秒列印三個結果,直到10個執行緒執行完,做到了併發數的控制。
應用場景
Semaphore可以用於做流量控制,控制併發數,特別公用資源有限的應用場景,比如資料庫連線。
Guava中有個RateLimit類使用令牌演算法也可以很好的做到流量控制,而且他們的方法也很類似,有空可以看下他的實現。
參考資料
相關文章
- java多執行緒系列:Semaphore和ExchangerJava執行緒
- Java多執行緒同步工具類之SemaphoreJava執行緒
- Java多執行緒20:多執行緒下的其他元件之CountDownLatch、Semaphore、ExchangerJava執行緒元件CountDownLatch
- java多執行緒10:併發工具類CountDownLatch、CyclicBarrier和SemaphoreJava執行緒CountDownLatch
- Java多執行緒——執行緒Java執行緒
- 多執行緒基礎(十九):Semaphore原始碼分析執行緒原始碼
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- Java多執行緒併發工具類-訊號量Semaphore物件講解Java執行緒物件
- java-多執行緒-CountDownLatch(閉鎖) CyclicBarrier(柵欄) Semaphore(訊號量)-Java執行緒CountDownLatch
- java——多執行緒Java執行緒
- java 多執行緒Java執行緒
- 【Java】多執行緒Java執行緒
- JAVA 多執行緒 ??Java執行緒
- java多執行緒Java執行緒
- Java - 多執行緒Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- Java多執行緒——守護執行緒Java執行緒
- Java多執行緒16:執行緒組Java執行緒
- Java多執行緒18:執行緒池Java執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- java多執行緒系列之執行緒池Java執行緒
- java 多執行緒 –同步Java執行緒
- java多執行緒原理Java執行緒
- java 多執行緒-3Java執行緒
- java 多執行緒-2Java執行緒
- java 多執行緒 --同步Java執行緒