并发工具类(三)控制并发线程数的Semaphore
http://ifeve.com/concurrency-semaphore/
簡(jiǎn)介
Semaphore(信號(hào)量)是用來(lái)控制同時(shí)訪問特定資源的線程數(shù)量,它通過協(xié)調(diào)各個(gè)線程,以保證合理的使用公共資源。很多年以來(lái),我都覺得從字面上很難理解Semaphore所表達(dá)的含義,只能把它比作是控制流量的紅綠燈,比如XX馬路要限制流量,只允許同時(shí)有一百輛車在這條路上行使,其他的都必須在路口等待,所以前一百輛車會(huì)看到綠燈,可以開進(jìn)這條馬路,后面的車會(huì)看到紅燈,不能駛?cè)隭X馬路,但是如果前一百輛中有五輛車已經(jīng)離開了XX馬路,那么后面就允許有5輛車駛?cè)腭R路,這個(gè)例子里說(shuō)的車就是線程,駛?cè)腭R路就表示線程在執(zhí)行,離開馬路就表示線程執(zhí)行完成,看見紅燈就表示線程被阻塞,不能執(zhí)行。
應(yīng)用場(chǎng)景
Semaphore可以用于做流量控制,特別公用資源有限的應(yīng)用場(chǎng)景,比如數(shù)據(jù)庫(kù)連接。假如有一個(gè)需求,要讀取幾萬(wàn)個(gè)文件的數(shù)據(jù),因?yàn)槎际荌O密集型任務(wù),我們可以啟動(dòng)幾十個(gè)線程并發(fā)的讀取,但是如果讀到內(nèi)存后,還需要存儲(chǔ)到數(shù)據(jù)庫(kù)中,而數(shù)據(jù)庫(kù)的連接數(shù)只有10個(gè),這時(shí)我們必須控制只有十個(gè)線程同時(shí)獲取數(shù)據(jù)庫(kù)連接保存數(shù)據(jù),否則會(huì)報(bào)錯(cuò)無(wú)法獲取數(shù)據(jù)庫(kù)連接。這個(gè)時(shí)候,我們就可以使用Semaphore來(lái)做流控,代碼如下:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore;public class SemaphoreTest {private static final int THREAD_COUNT = 30;private static ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_COUNT);private static Semaphore s = new Semaphore(10);public static void main(String[] args) {for (int i = 0; i < THREAD_COUNT; i++) {threadPool.execute(new Runnable() {@Overridepublic void run() {try {s.acquire();System.out.println(Thread.currentThread().getName());Thread.sleep(5000);System.out.println("--------------");s.release();} catch (InterruptedException e) {}}});}threadPool.shutdown();} }?
在代碼中,雖然有30個(gè)線程在執(zhí)行,但是只允許10個(gè)并發(fā)的執(zhí)行。Semaphore的構(gòu)造方法Semaphore(int permits) 接受一個(gè)整型的數(shù)字,表示可用的許可證數(shù)量。Semaphore(10)表示允許10個(gè)線程獲取許可證,也就是最大并發(fā)數(shù)是10。Semaphore的用法也很簡(jiǎn)單,首先線程使用Semaphore的acquire()獲取一個(gè)許可證,使用完之后調(diào)用release()歸還許可證。還可以用tryAcquire()方法嘗試獲取許可證。
其他方法
Semaphore還提供一些其他方法:
- int availablePermits() :返回此信號(hào)量中當(dāng)前可用的許可證數(shù)。
- int getQueueLength():返回正在等待獲取許可證的線程數(shù)。
- boolean hasQueuedThreads() :是否有線程正在等待獲取許可證。
- void reducePermits(int reduction) :減少reduction個(gè)許可證。是個(gè)protected方法。
- Collection getQueuedThreads() :返回所有等待獲取許可證的線程集合。是個(gè)protected方法
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/10083767.html
總結(jié)
以上是生活随笔為你收集整理的并发工具类(三)控制并发线程数的Semaphore的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: elasticsearch的join查询
- 下一篇: Python 可视化库