Java并發(fā)編程中的Exchanger解析
概述
用于線程間數(shù)據(jù)的交換。它提供一個同步點(diǎn),在這個同步點(diǎn),兩個線程可以交換彼此的數(shù)據(jù)。這兩個線程通過exchange方法交換數(shù)據(jù),如果第一個線程先執(zhí)行exchange()方法,它會一直等待第二個線程也執(zhí)行exchange方法,當(dāng)兩個線程都到達(dá)同步點(diǎn)時,這兩個線程就可以交換數(shù)據(jù),將本線程生產(chǎn)出來的數(shù)據(jù)傳遞給對方。
Exchanger 可被視為 SynchronousQueue 的雙向形式。Exchanger在遺傳算法和管道設(shè)計(jì)等應(yīng)用中很有用。
內(nèi)存一致性:對于通過 Exchanger 成功交換對象的每對線程,每個線程中在 exchange() 之前的操作 happen-before 從另一線程中相應(yīng)的 exchange() 返回的后續(xù)操作。
方法
提供的方法:
// 等待另一個線程到達(dá)此交換點(diǎn)(除非當(dāng)前線程被中斷),然后將給定的對象傳送給該線程,并接收該線程的對象。 public V exchange(V x) throws InterruptedException //增加超時機(jī)制,超過指定時間,拋TimeoutException異常 public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
使用示例
該類使用 Exchanger 在線程間交換緩沖區(qū),因此,在需要時,填充緩沖區(qū)的線程獲取一個新騰空的緩沖區(qū),并將填滿的緩沖區(qū)傳遞給清空緩沖區(qū)的線程。
class FillAndEmpty { Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>(); DataBuffer initialEmptyBuffer = ... a made-up type DataBuffer initialFullBuffer = ... //填充緩沖區(qū)線程 class FillingLoop implements Runnable { public void run() { DataBuffer currentBuffer = initialEmptyBuffer; //空的緩沖區(qū) try { while (currentBuffer != null) { addToBuffer(currentBuffer); //填充數(shù)據(jù) //如果緩沖區(qū)被數(shù)據(jù)填滿,執(zhí)行exchange。等待清空緩沖區(qū)線程也執(zhí)行exchange方法。當(dāng)兩個線程都到達(dá)同步點(diǎn),交換數(shù)據(jù)。 if (currentBuffer.isFull()) currentBuffer = exchanger.exchange(currentBuffer); } } catch (InterruptedException ex) { ... handle ... } } } //清空緩沖區(qū)線程 class EmptyingLoop implements Runnable { public void run() { DataBuffer currentBuffer = initialFullBuffer; //滿的緩沖區(qū) try { while (currentBuffer != null) { takeFromBuffer(currentBuffer); //清空緩沖區(qū) //如果緩沖區(qū)被清空,執(zhí)行exchange。等待填充緩沖區(qū)線程也執(zhí)行exchange方法。當(dāng)兩個線程都到達(dá)同步點(diǎn),交換數(shù)據(jù)。 if (currentBuffer.isEmpty()) currentBuffer = exchanger.exchange(currentBuffer); } } catch (InterruptedException ex) { ... handle ...} } } void start() { new Thread(new FillingLoop()).start(); new Thread(new EmptyingLoop()).start(); } }
到此這篇關(guān)于Java并發(fā)編程中的Exchanger解析的文章就介紹到這了,更多相關(guān)Java中的Exchanger內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot微服務(wù)注冊分布式Consul的詳細(xì)過程
這篇文章主要介紹了SpringBoot(微服務(wù))注冊分布式Consul,Spring Boot應(yīng)用可以通過向Consul注冊自身來實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和治理,使得其他服務(wù)可以在Consul中發(fā)現(xiàn)并調(diào)用它,需要的朋友可以參考下2023-04-04使用SpringBoot和JPA實(shí)現(xiàn)批量處理新增、修改
最近項(xiàng)目需要在JPA中使用ID進(jìn)行批量更新,所以下面這篇文章主要給大家介紹了關(guān)于使用SpringBoot和JPA實(shí)現(xiàn)批量處理新增、修改的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06關(guān)于springboot中對sqlSessionFactoryBean的自定義
這篇文章主要介紹了springboot中對sqlSessionFactoryBean的自定義方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Redis緩存,泛型集合與json字符串的相互轉(zhuǎn)換實(shí)例
這篇文章主要介紹了Redis緩存,泛型集合與json字符串的相互轉(zhuǎn)換實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07vue+springboot讀取git的markdown文件并展示功能
Markdown-it 是一個用于解析和渲染 Markdown 標(biāo)記語言的 JavaScript 庫,使用 Markdown-it,你可以將 Markdown 文本解析為 HTML 輸出,并且可以根據(jù)需要添加功能、擴(kuò)展語法或修改解析行為,本文介紹vue+springboot讀取git的markdown文件并展示,感興趣的朋友一起看看吧2024-01-01java實(shí)現(xiàn)word文檔轉(zhuǎn)pdf并添加水印的方法詳解
這篇文章主要介紹了java實(shí)現(xiàn)word文檔轉(zhuǎn)pdf并添加水印的方法,結(jié)合實(shí)例形式詳細(xì)分析了java word文檔轉(zhuǎn)PDF相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-09-09