併發工具類(三)控制併發執行緒數的Semaphore

2021-07-09 03:04:40 字數 1270 閱讀 6515

簡介

semaphore(訊號量)是用來控制同時訪問特定資源的執行緒數量,它通過協調各個執行緒,以保證合理的使用公共資源。很多年以來,我都覺得從字面上很難理解semaphore所表達的含義,只能把它比作是控制流量的紅綠燈,比如xx馬路要限制流量,只允許同時有一百輛車在這條路上行使,其他的都必須在路口等待,所以前一百輛車會看到綠燈,可以開進這條馬路,後面的車會看到紅燈,不能駛入xx馬路,但是如果前一百輛中有五輛車已經離開了xx馬路,那麼後面就允許有5輛車駛入馬路,這個例子裡說的車就是執行緒,駛入馬路就表示執行緒在執行,離開馬路就表示執行緒執行完成,看見紅燈就表示執行緒被阻塞,不能執行。

應用場景

semaphore可以用於做流量控制,特別公用資源有限的應用場景,比如資料庫連線。假如有乙個需求,要讀取幾萬個檔案的資料,因為都是io密集型任務,我們可以啟動幾十個執行緒併發的讀取,但是如果讀到記憶體後,還需要儲存到資料庫中,而資料庫的連線數只有10個,這時我們必須控制只有十個執行緒同時獲取資料庫連線儲存資料,否則會報錯無法獲取資料庫連線。這個時候,我們就可以使用semaphore來做流控,**如下:

01publicclasssemaphoretestcatch(interruptedexception e)

21}

22});

23}

24

25threadpool.shutdown();

26}

27}

在**中,雖然有30個執行緒在執行,但是只允許10個併發的執行。semaphore的構造方法semaphore(int permits) 接受乙個整型的數字,表示可用的許可證數量。semaphore(10)表示允許10個執行緒獲取許可證,也就是最大併發數是10。semaphore的用法也很簡單,首先執行緒使用semaphore的acquire()獲取乙個許可證,使用完之後呼叫release()歸還許可證。還可以用tryacquire()方法嘗試獲取許可證。

其他方法

semaphore還提供一些其他方法:

併發工具類(三)控制併發執行緒數的Semaphore

簡介 semaphore 訊號量 是用來控制同時訪問特定資源的執行緒數量,它通過協調各個執行緒,以保證合理的使用公共資源。很多年以來,我都覺得從字面上很難理解semaphore所表達的含義,只能把它比作是控制流量的紅綠燈,比如xx馬路要限制流量,只允許同時有一百輛車在這條路上行使,其他的都必須在路口...

併發工具類(三)控制併發執行緒數的Semaphore

原文 簡介semaphore 訊號量 是用來控制同時訪問特定資源的執行緒數量,它通過協調各個執行緒,以保證合理的使用公共資源。很多年以來,我都覺得從字面上很難理解semaphore所表達的含義,只能把它比作是控制流量的紅綠燈,比如xx馬路要限制流量,只允許同時有一百輛車在這條路上行使,其他的都必須在...

執行緒的併發工具類

countdownlatch 作用 是一組執行緒等待其他的執行緒完成工作以後在執行,加強版join await用來等待,countdown負責計數器的減一 cyclicbarrier 讓一組執行緒達到某個屏障,被阻塞,一直到組內最後乙個執行緒達到屏障時,屏障開放,所有被阻塞的執行緒會繼續執行cycl...