摘要:使用一個(gè)交換兩個(gè)線程的數(shù)據(jù),交換期間該會(huì)被鎖住,一般用于通信領(lǐng)域。當(dāng)雙方完成交換后,交換的就為的返回值。必須指定返回值的,否則該生產(chǎn)者生產(chǎn)的將不會(huì)與消費(fèi)者的空進(jìn)行交換。
Exchanger 使用一個(gè)pipeline交換兩個(gè)線程的數(shù)據(jù),交換期間該Slot會(huì)被鎖住,一般用于通信領(lǐng)域。
該類提供兩個(gè)方法
// k為交換對(duì)象
exchange(V k)
//指定超時(shí)時(shí)間
exchange(V k, int timeOut, TimeUnit unit)
使用時(shí),除了參數(shù)k必須外,返回值也必須使用k接收,否則會(huì)出現(xiàn)接收不到的數(shù)據(jù)的情況,如:
//生產(chǎn)者線程 ProductBean bean= new ProductBean() // 設(shè)置Product屬性 bean.set().... // 生產(chǎn)完成,開始與消費(fèi)者交換 bean = Exchanger實(shí)例名.exchange(bean) // 消費(fèi)者線程 ProductBean bean = new ProductBean(); bean = Exchanger實(shí)例名.exchange(bean)
生產(chǎn)者將生產(chǎn)的ProductBean放入pipeline中,等待交換。消費(fèi)者將空Bean放入pipeline等待交換。不論是生產(chǎn)者還是消費(fèi)者都必須接收exchange方法的返回值,即將exchange的bean賦值給bean。當(dāng)雙方完成交換后,交換的bean就為exchange的返回值。
必須指定返回值的bean,否則該生產(chǎn)者生產(chǎn)的bean將不會(huì)與消費(fèi)者的空bean進(jìn)行交換。
關(guān)于該類的最詳細(xì)解釋當(dāng)屬于源碼中的關(guān)于算法的注釋,這一部分并沒有顯示在doc文檔中,必須看源碼才能看見。該注釋中說到
The basic idea is to maintain a "slot", which is a reference to a Node containing both an Item to offer and a "hole" waiting to get filled in.
最基本的思想是維護(hù)一個(gè)Slot(槽),該Slot指向一個(gè)包含有一個(gè)用于交換的Item和一個(gè)等待填充的hole的Node。
該hole其實(shí)是用于接收交換的Node.
該算法解釋分為五部分,
Waiting
Sizing
Hashing
Probing
Padding
此外,該類的作者Doug Lea,還附上了一篇關(guān)于此思想的論文A Scalable Elimination-based Exchange Channel,可免費(fèi)獲得。
有同學(xué)做了如下圖,比較淺顯易懂。
關(guān)于此圖的解釋請(qǐng)移步至深入淺出 Java Concurrency (26): 并發(fā)容器 part 11 Exchanger
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/64115.html
摘要:作用用來交換兩個(gè)線程的數(shù)據(jù)。示例運(yùn)行結(jié)果如下首先,會(huì)經(jīng)過三秒后,才輸出結(jié)果,說明兩個(gè)線程沒交換之前是阻塞的。 作用 用來交換兩個(gè)線程的數(shù)據(jù)。 示例 public class ExchangerDemo { static Exchanger exchanger = new Exchanger(); static class Thread1 extends Thread ...
摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請(qǐng)注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言今天我們講最后一個(gè)同步工具類這個(gè)比較簡(jiǎn)單就是讓兩個(gè)線程交換數(shù)據(jù)理論只有兩個(gè)方法而已而且兩個(gè)還是一樣的只是參數(shù)不通而已跟另外一個(gè)線程交換數(shù)據(jù)如果另外一個(gè)線程的數(shù)據(jù)準(zhǔn)備好那么 本人郵箱: 歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明網(wǎng)址 http://blog.csdn.net/tianshi_kcogithub: https://github...
摘要:整個(gè)包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執(zhí)行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據(jù)一系列常見的多線程設(shè)計(jì)模式,設(shè)計(jì)了并發(fā)包,其中包下提供了一系列基礎(chǔ)的鎖工具,用以對(duì)等進(jìn)行補(bǔ)充增強(qiáng)。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首發(fā)于一世流云專欄:https...
摘要:倒計(jì)時(shí)鎖,線程中調(diào)用使進(jìn)程進(jìn)入阻塞狀態(tài),當(dāng)達(dá)成指定次數(shù)后通過繼續(xù)執(zhí)行每個(gè)線程中剩余的內(nèi)容。實(shí)現(xiàn)分階段的的功能測(cè)試代碼拿客網(wǎng)站群三產(chǎn)創(chuàng)建于年月日。 同步器 為每種特定的同步問題提供了解決方案 Semaphore Semaphore【信號(hào)標(biāo);旗語】,通過計(jì)數(shù)器控制對(duì)共享資源的訪問。 測(cè)試類: package concurrent; import concurrent.th...
摘要:對(duì)象改變條件對(duì)象當(dāng)前線程要等待線程終止之后才能從返回。如果線程在上的操作中被中斷,通道會(huì)被關(guān)閉,線程的中斷狀態(tài)會(huì)被設(shè)置,并得到一個(gè)。清除線程的中斷狀態(tài)。非公平性鎖雖然可能造成饑餓,但極少的線程切換,保證其更大的吞吐量。 聲明:Java并發(fā)的內(nèi)容是自己閱讀《Java并發(fā)編程實(shí)戰(zhàn)》和《Java并發(fā)編程的藝術(shù)》整理來的。 showImg(https://segmentfault.com/im...
閱讀 1240·2021-11-15 11:37
閱讀 2252·2021-09-30 09:55
閱讀 4517·2021-09-22 15:51
閱讀 3749·2021-09-22 15:46
閱讀 2772·2019-08-30 15:52
閱讀 428·2019-08-29 16:20
閱讀 2895·2019-08-29 15:12
閱讀 1134·2019-08-26 18:27