java.util.concurrent.Exchanger应用范例与原理浅析
http://www.cnblogs.com/davidwang456/p/4179488.html
Exchanger是自jdk1.5起開始提供的工具套件,一般用于兩個(gè)工作線程之間交換數(shù)據(jù)。在本文中我將采取由淺入深的方式來介紹分析這個(gè)工具類。首先我們來看看官方的api文檔中的敘述:
A synchronization point at which threads can pair and swap elements within pairs. Each thread presents some object on entry to the exchange method, matches with a partner thread, and receives its partner's object on return. An Exchanger may be viewed as a bidirectional form of a SynchronousQueue. Exchangers may be useful in applications such as genetic algorithms and pipeline designs.??? 在以上的描述中,有幾個(gè)要點(diǎn):
- 此類提供對(duì)外的操作是同步的;
- 用于成對(duì)出現(xiàn)的線程之間交換數(shù)據(jù);
- 可以視作雙向的同步隊(duì)列;
- 可應(yīng)用于基因算法、流水線設(shè)計(jì)等場(chǎng)景。
?? 接著看api文檔,這個(gè)類提供對(duì)外的接口非常簡(jiǎn)潔,一個(gè)無(wú)參構(gòu)造函數(shù),兩個(gè)重載的范型exchange方法:
public V exchange(V x) throws InterruptedException
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
?? 從官方的javadoc可以知道,當(dāng)一個(gè)線程到達(dá)exchange調(diào)用點(diǎn)時(shí),如果它的伙伴線程此前已經(jīng)調(diào)用了此方法,那么它的伙伴會(huì)被調(diào)度喚醒并與之進(jìn)行對(duì)象交換,然后各自返回。如果它的伙伴還沒到達(dá)交換點(diǎn),那么當(dāng)前線程將會(huì)被掛起,直至伙伴線程到達(dá)——完成交換正常返回;或者當(dāng)前線程被中斷——拋出中斷異常;又或者是等候超時(shí)——拋出超時(shí)異常。
注意的是,
線程1
obj1 = exchanger.exchange(obj1);
線程2
obj2= exchanger.exchange(obj2);
這樣對(duì)調(diào)的結(jié)果就是obj1 = obj2, obj2= obj1
在java中都是引用的交換
在下面的例子中,ReadThread交換之后的buffList就指向了null
總結(jié)
以上是生活随笔為你收集整理的java.util.concurrent.Exchanger应用范例与原理浅析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: make 调试和传参
- 下一篇: ssh能够连接而sftp不能连接的解决方