并發工具類(四)線程間的交換數據 Exchanger

前言

??JDK中為了處理線程之間的同步問題,除了提供鎖機制之外,還提供了幾個非常有用的并發工具類:CountDownLatch、CyclicBarrier、Semphore、Exchanger、Phaser;
??CountDownLatch、CyclicBarrier、Semphore、Phaser 這四個工具類提供一種并發流程的控制手段;而Exchanger工具類則提供了在線程之間交換數據的一種手段。

簡介

?? Exchanger的功能是使2個線程之間交換數據(有不少文章的說法是“傳輸數據”,應該叫“交換數據”更合適,因為這是兩個線程都要向對方傳送數據,同時也獲取對方的傳送過來的數據,是

雙向模式
,并不是一個線程向另一個線程傳輸數據)。它比生產者/消費者模式使用的wait/notify要更加方便。
??Exchanger 提供一個同步點,在這個同步點處,兩個線程可以交換彼此數據。即一個線程調用了exchange( )方法交換數據,到達了同步點,然后就會一直阻塞等待另一個線程調用exchange( )方法來交換數據。所以,要注意
exchange( )方法是有阻塞的特性。

Exchanger 可能在應用程序(比如
遺傳算法和管道設計
)中很有用。

方法摘要

public V exchange(V x) throws InterruptedException
等待另一個線程到達此交換點(除非當前線程被中斷),然后將給定的對象傳送給該線程,并接收該線程的對象。
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
等待另一個線程到達此交換點(除非當前線程被中斷,或者超出了指定的等待時間),然后將給定的對象傳送給該線程,同時接收該線程的對

@ Example1?用法示例

以下是重點介紹的一個類,該類使用 Exchanger 在線程間交換緩沖區,因此,在需要時,填充緩沖區的線程獲取一個新騰空的緩沖區,并將填滿的緩沖區傳遞給騰空緩沖區的線程

class FillAndEmpty {Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();DataBuffer initialEmptyBuffer = ... a made-up typeDataBuffer initialFullBuffer = ...class FillingLoop implements Runnable {public void run() {DataBuffer currentBuffer = initialEmptyBuffer;try {while (currentBuffer != null) {addToBuffer(currentBuffer);if (currentBuffer.isFull())currentBuffer = exchanger.exchange(currentBuffer);}} catch (InterruptedException ex) { ... handle ... }}}class EmptyingLoop implements Runnable {public void run() {DataBuffer currentBuffer = initialFullBuffer;try {while (currentBuffer != null) {takeFromBuffer(currentBuffer);if (currentBuffer.isEmpty())currentBuffer = exchanger.exchange(currentBuffer);}} catch (InterruptedException ex) { ... handle ...}}}void start() {new Thread(new FillingLoop()).start();new Thread(new EmptyingLoop()).start();}}
復制代碼

@ Example2?應用場景示例

Exchanger可以用于

遺傳算法,遺傳算法里需要選出兩個人作為交配對象,這時候會交換兩人的數據,并使用交叉規則得出2個交配結果。


Exchanger也可以用于

校對工作。

比如我們需要將紙制銀流通過人工的方式錄入成電子銀行流水,為了避免錯誤,采用AB崗兩人進行錄入,錄入到Excel之后,系統需要加載這兩個Excel,并對這兩個Excel數據進行校對,看看是否錄入的一致。代碼如下:

private static final Exchanger<String> exgr = new Exchanger<String>();
private static ExecutorService threadPool = Executors.newFixedThreadPool(2);public static void main(String[] args) {threadPool.execute(new Runnable() {@Overridepublic void run() {try {String A = "銀行流水A";// A錄入銀行流水數據exgr.exchange(A);//同步點,交換數據} catch (InterruptedException e) {}}});threadPool.execute(new Runnable() {@Overridepublic void run() {try {String B = "銀行流水B";// B錄入銀行流水數據String A = exgr.exchange("B");//同步點,交換數據System.out.println("A和B數據是否一致:" + A.equals(B) + "\nA錄入的是:"+ A + "\nB錄入的是:" + B);} catch (InterruptedException e) {}}});threadPool.shutdown();
}
復制代碼

運行結果:

A和B數據是否一致:false
A錄入的是:銀行流水A
B錄入的是:銀行流水B
復制代碼

文章源地址:https://www.cnblogs.com/jinggod/p/8494384.html


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276092.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276092.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276092.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

「前端組件化」該怎么理解?

大家好&#xff0c;我是若川。今天分享一篇關于「前端組件化」的好文。歡迎點擊下方卡片關注我。以下是正文~這里我們一起來學習前端組件化的知識&#xff0c;而組件化在前端架構里面是最重要的一個部分。講到前端架構&#xff0c;其實前端架構中最熱門的就有兩個話題&#xff…

大屏設計的視覺統一_視覺設計中的統一

大屏設計的視覺統一視覺設計的統一性是什么&#xff1f; (What is unity in visual design?) The concept of unity in visual design means a group of elements working together to create a greater whole. It means, as the clich goes: A whole that is greater than th…

l2范數求導_機器學習中的范數規則化之(一)L0、L1與L2范數

source: https://blog.csdn.net/zouxy09/article/details/24971995zouxy09qq.comhttp://blog.csdn.net/zouxy09今天我們聊聊機器學習中出現的非常頻繁的問題&#xff1a;過擬合與規則化。我們先簡單的來理解下常用的L0、L1、L2和核范數規則化。最后聊下規則化項參數的選擇問題。…

9.struts1.x中tiles框架的使用

在頁面直接使用titles標簽先引入標簽&#xff1a;<%taglib uri"http://struts.apache.org/tags-tiles" prefix"tiles" %> 將模板頁面要代替的內容用標簽占位&#xff1a;<tiles:insert attribute"content"></tiles:insert> 在…

Debian 9.6.0 + OpenMediaVault 4.x : U盤作系統盤時遇到的問題

前幾天在虛擬機試驗的時候還說裝到實機一般也沒什么問題&#xff0c;然后突然間想試試如果把 Debian9OMV 都放到U盤里會怎么樣。于是就折騰&#xff08;然后懵逼&#xff09; 先總結一下 寫入openmediavault官方的iso到U盤使用UNetbootin寫入Debian9的iso使用UltraISO的默認設置…

新浪微博、騰訊微博、QQ空間、人人網、豆瓣 一鍵分享API

轉載鏈接&#xff1a;http://www.bluesdream.com/blog/sina-tencent-renren-douban-share-a-key-api.html 新浪微博&#xff1a; http://service.weibo.com/share/share.php?url count表示是否顯示當前頁面被分享數量(1顯示)(可選&#xff0c;允許為空) &url將頁面地址轉…

跟著官方文檔能學懂React Hooks就怪了

大家好&#xff0c;我是若川。今天分享一篇關于「React Hooks」的好文。歡迎點擊下方卡片關注我。以下是正文~回想下你入門Hooks的過程&#xff0c;是不是經歷過&#xff1a;類比ClassComponent的生命周期&#xff0c;學習Hooks的執行時機慢慢熟練以后&#xff0c;發現Hooks的執…

origin圖上顯示數據標簽_Origin(Pro):寒假都結束了,這個圖還是不會畫?【數據繪圖】...

寒假前給大家分享了一個圖&#xff0c;大家要的教程來了。【數據繪圖】好圖分享&#xff1a;寒假&#xff1f;不存在的&#xff01;?mp.weixin.qq.com繪圖思路&#xff1a;左側起止時間&#xff1a;散點圖&#xff0c;交換XY坐標軸&#xff1b;中間的連線為Drop Lines&#xf…

可以激發設計靈感的音樂_建立靈感庫以激發您的創造力

可以激發設計靈感的音樂I often find a lot of inspiration from work I see while scrolling social media. Saving art or images that inspire you allows you to build a library of resources to draw from whenever you’re working on a project.在滾動社交媒體時&#…

CentOS服務器上部署 oracle10gr2

1、下載Centos系統 Linux 鏡像文件。 推薦使用 CentOS5.4&#xff0c;下載地址&#xff1a;http://isoredirect.centos.org/centos/5/isos/i386/ 。這個是 32 位的 Linux 系統鏡像安裝文件&#xff0c;進入下載頁面后&#xff0c;如果是 DVD 光盤安裝&#xff0c;可以僅…

回顧:中網通訊網絡公司CEO羅與曾作客新浪嘉賓聊天室

轉載鏈接&#xff1a;http://tech.sina.com.cn/it/w/2001-11-09/91253.shtml 回顧&#xff1a;中網通訊網絡公司CEO羅與曾作客新浪嘉賓聊天室 大家好&#xff01;   主持人 &#xff1a;各位網友&#xff0c;下午好&#xff0c;今天我們請到了中網通訊網絡公司首席執行官羅…

form——驗證器Validators

form表單最大的作用就是驗證功能了&#xff0c;通過cleaned_data清洗&#xff0c;我們可以獲取傳來的值&#xff0c;通過參數、驗證器、自定義驗證方法&#xff0c;我們可以做到很多的驗證。 驗證器可用于在不同類型的字段之間重用驗證邏輯。validators有自帶的驗證器&#xff…

若川知乎問答:做前端感覺很吃力怎么辦?

前些日&#xff0c;我發了一篇推文《做前端感到越來越吃力了&#xff01;怎么辦&#xff1f;》&#xff0c;雖然是推廣&#xff0c;但閱讀量卻很高&#xff0c;推廣標題我們大概率不能改&#xff0c;感覺騙了大家&#xff0c;掉粉挺多人。寫稿的人可能就是看到了知乎這個問答。…

惠新宸php教程_惠新宸:首位國人加入PHP語言官方開發組

PHP開發組終于有了國人參與。最近&#xff0c; Laruence(真名惠新宸)加入了PHP語言官方開發組。 做PHP的同學一定很熟悉他了&#xff0c;他的博客風雪之隅(https://www.laruence.com/)發表了很多PHP源代碼分析和擴展開發相關的文章。他使用PHP擴展開發的PHP框架Yaf&#xff0c;…

d3 制作條形圖_停止制作常見的壞條形圖的5個簡單技巧

d3 制作條形圖Bar charts were probably the first type of chart you were ever introduced to in first grade. Their simplicity makes them a standard in visualizing data, but it is its accessibility that leads visualizers to often be careless with bar charts.乙…

SVN之使用原則

以下是我起草的部門SVN規范里原則的一部分。文件提交時要求必須提交注釋&#xff0c;注明相關修改信息&#xff0c;例如bug號、任務描述等。具體內容可采用約定或者設置的形式。你所提交的改變將體現給其他開發者&#xff0c;要明白提交的后果&#xff0c;提交之前要慎重。代碼…

圖解 React-router 源碼

大家好&#xff0c;我是若川。歡迎加我微信 ruochuan12今天分享一篇react-router源碼文章&#xff0c;深入理解路由的本質。微信預計閱讀只需8分鐘。點擊下方卡片關注我&#xff0c;或者查看源碼系列文章。閱讀源碼小 tips&#xff1a;從整體到細節&#xff0c;剛開始不要太拘泥…

青海西寧市大通縣非洲豬瘟疫區解除封鎖

中新網1月23日電 據農業農村部網站消息&#xff0c;農業農村部接到青海省農業農村廳報告&#xff0c;經評估驗收合格&#xff0c;青海省西寧市大通縣非洲豬瘟疫區解除封鎖。 大通縣非洲豬瘟疫情發生后&#xff0c;當地按照非洲豬瘟疫情應急預案和非洲豬瘟防治技術規范要求&…

回顧:中網飽經滄桑劫后余生 萬平國回首艱辛歷程

轉載鏈接&#xff1a;http://tech.sina.com.cn/i/c/75586.shtml 回顧&#xff1a;中網飽經滄桑劫后余生 萬平國回首艱辛歷程 http://www.sina.com.cn 2001年07月12日 13:25 財經時報   “最早的聊天室是我們做的、最早的檢索也是中網公司的、中網公司也是最早做電子商務的數…

android 輔助功能_輔助功能簡介

android 輔助功能Accessibility may be more than a moral imperative to ensure products are inclusive of more people who already experience barriers in daily life — it has a very practical outcome, benefiting everyone including the person with the disability…