Java并發(fā)編程中的Exchanger解析
概述
用于線程間數(shù)據(jù)的交換。它提供一個同步點,在這個同步點,兩個線程可以交換彼此的數(shù)據(jù)。這兩個線程通過exchange方法交換數(shù)據(jù),如果第一個線程先執(zhí)行exchange()方法,它會一直等待第二個線程也執(zhí)行exchange方法,當兩個線程都到達同步點時,這兩個線程就可以交換數(shù)據(jù),將本線程生產(chǎn)出來的數(shù)據(jù)傳遞給對方。
Exchanger 可被視為 SynchronousQueue 的雙向形式。Exchanger在遺傳算法和管道設計等應用中很有用。
內存一致性:對于通過 Exchanger 成功交換對象的每對線程,每個線程中在 exchange() 之前的操作 happen-before 從另一線程中相應的 exchange() 返回的后續(xù)操作。
方法
提供的方法:
// 等待另一個線程到達此交換點(除非當前線程被中斷),然后將給定的對象傳送給該線程,并接收該線程的對象。 public V exchange(V x) throws InterruptedException //增加超時機制,超過指定時間,拋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方法。當兩個線程都到達同步點,交換數(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方法。當兩個線程都到達同步點,交換數(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(); } }
到此這篇關于Java并發(fā)編程中的Exchanger解析的文章就介紹到這了,更多相關Java中的Exchanger內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用SpringBoot和JPA實現(xiàn)批量處理新增、修改
最近項目需要在JPA中使用ID進行批量更新,所以下面這篇文章主要給大家介紹了關于使用SpringBoot和JPA實現(xiàn)批量處理新增、修改的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-06-06關于springboot中對sqlSessionFactoryBean的自定義
這篇文章主要介紹了springboot中對sqlSessionFactoryBean的自定義方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12vue+springboot讀取git的markdown文件并展示功能
Markdown-it 是一個用于解析和渲染 Markdown 標記語言的 JavaScript 庫,使用 Markdown-it,你可以將 Markdown 文本解析為 HTML 輸出,并且可以根據(jù)需要添加功能、擴展語法或修改解析行為,本文介紹vue+springboot讀取git的markdown文件并展示,感興趣的朋友一起看看吧2024-01-01java實現(xiàn)word文檔轉pdf并添加水印的方法詳解
這篇文章主要介紹了java實現(xiàn)word文檔轉pdf并添加水印的方法,結合實例形式詳細分析了java word文檔轉PDF相關實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下2019-09-09