亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

通俗易懂學(xué)習(xí)java并發(fā)工具類(lèi)-Semaphore,Exchanger

 更新時(shí)間:2019年06月04日 08:38:56   作者:你聽(tīng)___  
這篇文章主要介紹了java并發(fā)工具類(lèi)-Semaphore,Exchanger,java并發(fā)工具類(lèi)有很多,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面小編帶大家來(lái)一起學(xué)習(xí)一下吧

1. 控制資源并發(fā)訪問(wèn)--Semaphore

Semaphore可以理解為信號(hào)量,用于控制資源能夠被并發(fā)訪問(wèn)的線程數(shù)量,以保證多個(gè)線程能夠合理的使用特定資源。

Semaphore就相當(dāng)于一個(gè)許可證,線程需要先通過(guò)acquire方法獲取該許可證,該線程才能繼續(xù)往下執(zhí)行,否則只能在該方法出阻塞等待。當(dāng)執(zhí)行完業(yè)務(wù)功能后,需要通過(guò)release()方法將許可證歸還,以便其他線程能夠獲得許可證繼續(xù)執(zhí)行。

Semaphore可以用于做流量控制,特別是公共資源有限的應(yīng)用場(chǎng)景,比如數(shù)據(jù)庫(kù)連接。假如有多個(gè)線程讀取數(shù)據(jù)后,需要將數(shù)據(jù)保存在數(shù)據(jù)庫(kù)中,而可用的最大數(shù)據(jù)庫(kù)連接只有10個(gè),這時(shí)候就需要使用Semaphore來(lái)控制能夠并發(fā)訪問(wèn)到數(shù)據(jù)庫(kù)連接資源的線程個(gè)數(shù)最多只有10個(gè)。在限制資源使用的應(yīng)用場(chǎng)景下,Semaphore是特別合適的。

下面來(lái)看下Semaphore的主要方法:

//獲取許可,如果無(wú)法獲取到,則阻塞等待直至能夠獲取為止
void acquire() throws InterruptedException
//同acquire方法功能基本一樣,只不過(guò)該方法可以一次獲取多個(gè)許可
void acquire(int permits) throws InterruptedException
//釋放許可
void release()
//釋放指定個(gè)數(shù)的許可
void release(int permits)
//嘗試獲取許可,如果能夠獲取成功則立即返回true,否則,則返回false
boolean tryAcquire()
//與tryAcquire方法一致,只不過(guò)這里可以指定獲取多個(gè)許可
boolean tryAcquire(int permits)
//嘗試獲取許可,如果能夠立即獲取到或者在指定時(shí)間內(nèi)能夠獲取到,則返回true,否則返回false
boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException
//與上一個(gè)方法一致,只不過(guò)這里能夠獲取多個(gè)許可
boolean tryAcquire(int permits, long timeout, TimeUnit unit)
//返回當(dāng)前可用的許可證個(gè)數(shù)
int availablePermits()
//返回正在等待獲取許可證的線程數(shù)
int getQueueLength()
//是否有線程正在等待獲取許可證
boolean hasQueuedThreads()
//獲取所有正在等待許可的線程集合
Collection<Thread> getQueuedThreads()


另外,在Semaphore的構(gòu)造方法中還支持指定是夠具有公平性,默認(rèn)的是非公平性,這樣也是為了保證吞吐量。

一個(gè)例子

下面用一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明Semaphore的具體使用。我們來(lái)模擬這樣一樣場(chǎng)景。有一天,班主任需要班上10個(gè)同學(xué)到講臺(tái)上來(lái)填寫(xiě)一個(gè)表格,但是老師只準(zhǔn)備了5支筆,因此,只能保證同時(shí)只有5個(gè)同學(xué)能夠拿到筆并填寫(xiě)表格,沒(méi)有獲取到筆的同學(xué)只能夠等前面的同學(xué)用完之后,才能拿到筆去填寫(xiě)表格。該示例代碼如下:

public class SemaphoreDemo {
//表示老師只有10支筆
private static Semaphore semaphore = new Semaphore(5);
public static void main(String[] args) {
//表示50個(gè)學(xué)生
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
service.execute(() -> {
try {
System.out.println(Thread.currentThread().getName() + " 同學(xué)準(zhǔn)備獲取筆......");
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + " 同學(xué)獲取到筆");
System.out.println(Thread.currentThread().getName() + " 填寫(xiě)表格ing.....");
TimeUnit.SECONDS.sleep(3);
semaphore.release();
System.out.println(Thread.currentThread().getName() + " 填寫(xiě)完表格,歸還了筆?。。。。。?);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
service.shutdown();
}
}

輸出結(jié)果:

pool-1-thread-1 同學(xué)準(zhǔn)備獲取筆......
pool-1-thread-1 同學(xué)獲取到筆
pool-1-thread-1 填寫(xiě)表格ing.....
pool-1-thread-2 同學(xué)準(zhǔn)備獲取筆......
pool-1-thread-2 同學(xué)獲取到筆
pool-1-thread-2 填寫(xiě)表格ing.....
pool-1-thread-3 同學(xué)準(zhǔn)備獲取筆......
pool-1-thread-4 同學(xué)準(zhǔn)備獲取筆......
pool-1-thread-3 同學(xué)獲取到筆
pool-1-thread-4 同學(xué)獲取到筆
pool-1-thread-4 填寫(xiě)表格ing.....
pool-1-thread-3 填寫(xiě)表格ing.....
pool-1-thread-5 同學(xué)準(zhǔn)備獲取筆......
pool-1-thread-5 同學(xué)獲取到筆
pool-1-thread-5 填寫(xiě)表格ing.....
pool-1-thread-6 同學(xué)準(zhǔn)備獲取筆......
pool-1-thread-7 同學(xué)準(zhǔn)備獲取筆......
pool-1-thread-8 同學(xué)準(zhǔn)備獲取筆......
pool-1-thread-9 同學(xué)準(zhǔn)備獲取筆......
pool-1-thread-10 同學(xué)準(zhǔn)備獲取筆......
pool-1-thread-4 填寫(xiě)完表格,歸還了筆?。。。。?!
pool-1-thread-9 同學(xué)獲取到筆
pool-1-thread-9 填寫(xiě)表格ing.....
pool-1-thread-5 填寫(xiě)完表格,歸還了筆?。。。。?!
pool-1-thread-7 同學(xué)獲取到筆
pool-1-thread-7 填寫(xiě)表格ing.....
pool-1-thread-8 同學(xué)獲取到筆
pool-1-thread-8 填寫(xiě)表格ing.....
pool-1-thread-1 填寫(xiě)完表格,歸還了筆?。。。。?!
pool-1-thread-6 同學(xué)獲取到筆
pool-1-thread-6 填寫(xiě)表格ing.....
pool-1-thread-3 填寫(xiě)完表格,歸還了筆?。。。。。?
pool-1-thread-2 填寫(xiě)完表格,歸還了筆!?。。。?!
pool-1-thread-10 同學(xué)獲取到筆
pool-1-thread-10 填寫(xiě)表格ing.....
pool-1-thread-7 填寫(xiě)完表格,歸還了筆!!?。。?!
pool-1-thread-9 填寫(xiě)完表格,歸還了筆!?。。。?!
pool-1-thread-8 填寫(xiě)完表格,歸還了筆?。。。。。?
pool-1-thread-6 填寫(xiě)完表格,歸還了筆?。。。。?!
pool-1-thread-10 填寫(xiě)完表格,歸還了筆?。。。。?!

根據(jù)輸出結(jié)果進(jìn)行分析,Semaphore允許的最大許可數(shù)為5,也就是允許的最大并發(fā)執(zhí)行的線程個(gè)數(shù)為5,可以看出,前5個(gè)線程(前5個(gè)學(xué)生)先獲取到筆,然后填寫(xiě)表格,而6-10這5個(gè)線程,由于獲取不到許可,只能阻塞等待。

當(dāng)線程pool-1-thread-4釋放了許可之后,pool-1-thread-9就可以獲取到許可,繼續(xù)往下執(zhí)行。對(duì)其他線程的執(zhí)行過(guò)程,也是同樣的道理。

從這個(gè)例子就可以看出,Semaphore用來(lái)做特殊資源的并發(fā)訪問(wèn)控制是相當(dāng)合適的,如果有業(yè)務(wù)場(chǎng)景需要進(jìn)行流量控制,可以?xún)?yōu)先考慮Semaphore。

2.線程間交換數(shù)據(jù)的工具--Exchanger

Exchanger是一個(gè)用于線程間協(xié)作的工具類(lèi),用于兩個(gè)線程間能夠交換。它提供了一個(gè)交換的同步點(diǎn),在這個(gè)同步點(diǎn)兩個(gè)線程能夠交換數(shù)據(jù)。

具體交換數(shù)據(jù)是通過(guò)exchange方法來(lái)實(shí)現(xiàn)的,如果一個(gè)線程先執(zhí)行exchange方法,那么它會(huì)同步等待另一個(gè)線程也執(zhí)行exchange方法,這個(gè)時(shí)候兩個(gè)線程就都達(dá)到了同步點(diǎn),兩個(gè)線程就可以交換數(shù)據(jù)。

Exchanger除了一個(gè)無(wú)參的構(gòu)造方法外,主要方法也很簡(jiǎn)單:

//當(dāng)一個(gè)線程執(zhí)行該方法的時(shí)候,會(huì)等待另一個(gè)線程也執(zhí)行該方法,因此兩個(gè)線程就都達(dá)到了同步點(diǎn)
//將數(shù)據(jù)交換給另一個(gè)線程,同時(shí)返回獲取的數(shù)據(jù)
V exchange(V x) throws InterruptedException
//同上一個(gè)方法功能基本一樣,只不過(guò)這個(gè)方法同步等待的時(shí)候,增加了超時(shí)時(shí)間
V exchange(V x, long timeout, TimeUnit unit)
throws InterruptedException, TimeoutException 

一個(gè)例子

Exchanger理解起來(lái)很容易,這里用一個(gè)簡(jiǎn)單的例子來(lái)看下它的具體使用。我們來(lái)模擬這樣一個(gè)情景,在青春洋溢的中學(xué)時(shí)代,下課期間,男生經(jīng)常會(huì)給走廊里為自己喜歡的女孩子送情書(shū),相信大家都做過(guò)這樣的事情吧 :)。男孩會(huì)先到女孩教室門(mén)口,然后等女孩出來(lái),教室那里就是一個(gè)同步點(diǎn),然后彼此交換信物,也就是彼此交換了數(shù)據(jù)?,F(xiàn)在,就來(lái)模擬這個(gè)情景。

public class ExchangerDemo {
private static Exchanger<String> exchanger = new Exchanger();
public static void main(String[] args) {
//代表男生和女生
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(() -> {
try {
//男生對(duì)女生說(shuō)的話
String girl = exchanger.exchange("我其實(shí)暗戀你很久了......");
System.out.println("女孩兒說(shuō):" + girl);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
service.execute(() -> {
try {
System.out.println("女生慢慢的從教室你走出來(lái)......");
TimeUnit.SECONDS.sleep(3);
//男生對(duì)女生說(shuō)的話
String boy = exchanger.exchange("我也很喜歡你......");
System.out.println("男孩兒說(shuō):" + boy);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}

輸出結(jié)果:

女生慢慢的從教室你走出來(lái)......
男孩兒說(shuō):我其實(shí)暗戀你很久了......
女孩兒說(shuō):我也很喜歡你......

這個(gè)例子很簡(jiǎn)單,也很能說(shuō)明Exchanger的基本使用。當(dāng)兩個(gè)線程都到達(dá)調(diào)用exchange方法的同步點(diǎn)的時(shí)候,兩個(gè)線程就能交換彼此的數(shù)據(jù)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java模擬HTTP Get Post請(qǐng)求實(shí)現(xiàn)論壇自動(dòng)回帖功能

    Java模擬HTTP Get Post請(qǐng)求實(shí)現(xiàn)論壇自動(dòng)回帖功能

    這篇文章主要介紹了Java模擬HTTP Get Post請(qǐng)求實(shí)現(xiàn)論壇自動(dòng)回帖功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java判斷2個(gè)List集合是否相等(不考慮元素的順序)

    Java判斷2個(gè)List集合是否相等(不考慮元素的順序)

    今天小編就為大家分享一篇關(guān)于Java判斷2個(gè)List集合是否相等(不考慮元素的順序)的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • 解決java 命令行亂碼的問(wèn)題

    解決java 命令行亂碼的問(wèn)題

    這篇文章主要介紹了解決java 命令行亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java 指定某個(gè)jdk版本方法

    java 指定某個(gè)jdk版本方法

    這篇文章主要介紹了java 指定某個(gè)jdk版本方法的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Spring Boot整合MyBatis-Flex全過(guò)程

    Spring Boot整合MyBatis-Flex全過(guò)程

    這篇文章主要介紹了Spring Boot整合MyBatis-Flex全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • SpringBoot java-jar命令行啟動(dòng)原理解析

    SpringBoot java-jar命令行啟動(dòng)原理解析

    這篇文章主要介紹了SpringBoot java-jar命令行啟動(dòng)原理解析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot中的Future接口詳解

    SpringBoot中的Future接口詳解

    這篇文章主要介紹了SpringBoot中的Future接口詳解,在異步編程中,我們通常需要處理一些耗時(shí)的操作,一種常見(jiàn)的做法是使用 Future 接口來(lái)代表一個(gè)異步操作的結(jié)果,需要的朋友可以參考下
    2023-07-07
  • Java創(chuàng)建線程的方式解析

    Java創(chuàng)建線程的方式解析

    這篇文章主要介紹了Java創(chuàng)建線程的方式解析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-07-07
  • JAVA開(kāi)發(fā)環(huán)境搭建教程

    JAVA開(kāi)發(fā)環(huán)境搭建教程

    這篇文章主要為大家詳細(xì)介紹了JAVA開(kāi)發(fā)環(huán)境搭建教程,配置JAVA開(kāi)發(fā)環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 深入了解Spring中的FactoryBean

    深入了解Spring中的FactoryBean

    這篇文章主要介紹了深入了解Spring中的FactoryBean,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論