java.util.concurrent.Exchanger应用范例与原理浅析
http://www.cnblogs.com/davidwang456/p/4179488.html
Exchanger是自jdk1.5起開始提供的工具套件,一般用于兩個工作線程之間交換數據。在本文中我將采取由淺入深的方式來介紹分析這個工具類。首先我們來看看官方的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.??? 在以上的描述中,有幾個要點:
- 此類提供對外的操作是同步的;
- 用于成對出現的線程之間交換數據;
- 可以視作雙向的同步隊列;
- 可應用于基因算法、流水線設計等場景。
?? 接著看api文檔,這個類提供對外的接口非常簡潔,一個無參構造函數,兩個重載的范型exchange方法:
public V exchange(V x) throws InterruptedException
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
?? 從官方的javadoc可以知道,當一個線程到達exchange調用點時,如果它的伙伴線程此前已經調用了此方法,那么它的伙伴會被調度喚醒并與之進行對象交換,然后各自返回。如果它的伙伴還沒到達交換點,那么當前線程將會被掛起,直至伙伴線程到達——完成交換正常返回;或者當前線程被中斷——拋出中斷異常;又或者是等候超時——拋出超時異常。
注意的是,
線程1
obj1 = exchanger.exchange(obj1);
線程2
obj2= exchanger.exchange(obj2);
這樣對調的結果就是obj1 = obj2, obj2= obj1
在java中都是引用的交換
在下面的例子中,ReadThread交換之后的buffList就指向了null
總結
以上是生活随笔為你收集整理的java.util.concurrent.Exchanger应用范例与原理浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: make 调试和传参
- 下一篇: ssh能够连接而sftp不能连接的解决方