Java開發(fā)JUC交換器Exchanger使用詳解
前言
JDK中提供了不少的同步工具,現(xiàn)在分享一個相對比較冷門的同步工具——交換器(Exchanger
)。你知道Exchanger
的作用是什么嗎?實現(xiàn)機(jī)制是什么?可以用來做什么呢?
Exchanger介紹
交換器(Exchanger
),顧名思義,用于兩個線程之間進(jìn)行數(shù)據(jù)交換的。
簡單來說,就是一個線程在完成一定的事務(wù)后想與另一個線程交換數(shù)據(jù),則第一個先拿出數(shù)據(jù)的線程會一直等待第二個線程,直到第二個線程拿著數(shù)據(jù)到來時才能彼此交換對應(yīng)數(shù)據(jù)。如下圖所示:
兩個線程通過 exchange()
方法交換數(shù)據(jù),如果第一個線程先執(zhí)行 exchange()
方法,它會一直等待第二個線程也執(zhí)行 exchange 方法,當(dāng)兩個線程都到達(dá)同步點時,這兩個線程就可以交換數(shù)據(jù)
API介紹
構(gòu)造方法
Exchanger()
:創(chuàng)建一個交換器
常用方法
V exchange(V x)
: 交換數(shù)據(jù),如果只有一個線程,會阻塞,直到另外一個線程也調(diào)用exchange, 支持中斷V exchange(V x, long timeout, TimeUnit unit)
: 帶超時參數(shù)的交換數(shù)據(jù)
Exchanger使用
這不,馬上圣誕節(jié)要到了,你要和你對象交換禮物,不準(zhǔn)備的話,你就要死的很慘~~我們就可以用Exchanger
來實現(xiàn)。
@Slf4j(topic = "c.ExchangerTest") public class ExchangerTest { public static void main(String[] args) throws InterruptedException { Exchanger<String> exchanger = new Exchanger<>(); Thread boy = new Thread(new Runnable() { @Override public void run() { log.info("你開始準(zhǔn)備禮物~~~~~~~~~~~~"); try { // 模擬準(zhǔn)備禮物時間 Thread.sleep(5000); String gift = "IPhone 14"; log.info("你送了禮物: {}", gift); String recGift = exchanger.exchange(gift); log.info("你收到了禮物: {}", recGift); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread girl = new Thread(new Runnable() { @Override public void run() { log.info("女朋友開始準(zhǔn)備禮物~~~~~~~~~~~~"); try { // 模擬準(zhǔn)備禮物時間 Thread.sleep(6000); String gift = "一個吻"; log.info("女朋友送了禮物: {}", gift); String recGift = exchanger.exchange(gift); log.info("女朋友收到了禮物: {}", recGift); } catch (InterruptedException e) { e.printStackTrace(); } } }); boy.start(); girl.start(); boy.join(); girl.join(); } }
運(yùn)行結(jié)果:
- 中間阻塞等待了一秒,直到你女朋友也準(zhǔn)備好了禮物。
實現(xiàn)機(jī)制
實現(xiàn)機(jī)制也很容易能夠想到,Exchanger
類中定義一個槽位slot
,
- A線程交換數(shù)據(jù)時,發(fā)現(xiàn)slot為空,則將需要交換的數(shù)據(jù)放在slot中, 阻塞當(dāng)前線程,等待其它線程進(jìn)來交換數(shù)據(jù)
- 等線程B進(jìn)來,讀取A設(shè)置的數(shù)據(jù),然后設(shè)置線程B需要交換的數(shù)據(jù),然后喚醒A線程。
Exchanger
的源碼實現(xiàn)大家感興趣的話,自己可以看看。
總結(jié)
本文講解了交換器Exchanger
,是jdk5中引入的一個同步器。實際上在平時工作場景中基本上很少應(yīng)用,按照官方注釋說可以應(yīng)用在基因算法或者管道設(shè)計,太抽象了,大家就當(dāng)擴(kuò)擴(kuò)知識面吧,更多關(guān)于Java JUC交換器Exchanger的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot詳解實現(xiàn)車險理賠信息管理系統(tǒng)代碼
本系統(tǒng)基于Springboot開發(fā)實現(xiàn)了一個為用戶車險進(jìn)行理賠信息管理的一個信息化管理系統(tǒng),核心的業(yè)務(wù)主要是用戶申請保險理賠,管理員審核進(jìn)入理賠程序,事故調(diào)查員對事故進(jìn)行調(diào)查和現(xiàn)場勘察,這其中共涉及到三類用戶,購買保險的客戶,事故調(diào)查員和系統(tǒng)管理員2022-06-06Spring使用IOC與DI實現(xiàn)完全注解開發(fā)
IOC也是Spring的核心之一了,之前學(xué)的時候是采用xml配置文件的方式去實現(xiàn)的,后來其中也多少穿插了幾個注解,但是沒有說完全采用注解實現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來實現(xiàn)IOC + DI2022-09-09SpringMVC結(jié)合天氣api實現(xiàn)天氣查詢
這篇文章主要為大家詳細(xì)介紹了SpringMVC結(jié)合天氣api實現(xiàn)天氣查詢,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05Spring中異步注解@Async的使用、原理及使用時可能導(dǎo)致的問題及解決方法
這篇文章主要介紹了Spring中異步注解@Async的使用、原理及使用時可能導(dǎo)致的問題及解決方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07SpringBoot前后端交互、全局異常處理之后端異常信息拋到前端顯示彈窗
Spring Boot是一個用于構(gòu)建獨立的、基于生產(chǎn)級別的Spring應(yīng)用程序的框架,下面這篇文章主要給大家介紹了關(guān)于SpringBoot前后端交互、全局異常處理之后端異常信息拋到前端顯示彈窗的相關(guān)資料,需要的朋友可以參考下2024-08-08