日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java.util.concurrent.Exchanger应用范例与原理浅析

發(fā)布時間:2024/9/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java.util.concurrent.Exchanger应用范例与原理浅析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://www.cnblogs.com/davidwang456/p/4179488.html

Exchanger是自jdk1.5起開始提供的工具套件,一般用于兩個工作線程之間交換數(shù)據(jù)。在本文中我將采取由淺入深的方式來介紹分析這個工具類。首先我們來看看官方的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.

??? 在以上的描述中,有幾個要點:

  • 此類提供對外的操作是同步的;
  • 用于成對出現(xiàn)的線程之間交換數(shù)據(jù);
  • 可以視作雙向的同步隊列;
  • 可應(yīng)用于基因算法、流水線設(shè)計等場景。

?? 接著看api文檔,這個類提供對外的接口非常簡潔,一個無參構(gòu)造函數(shù),兩個重載的范型exchange方法:
public V exchange(V x) throws InterruptedException
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
?? 從官方的javadoc可以知道,當(dāng)一個線程到達(dá)exchange調(diào)用點時,如果它的伙伴線程此前已經(jīng)調(diào)用了此方法,那么它的伙伴會被調(diào)度喚醒并與之進(jìn)行對象交換,然后各自返回。如果它的伙伴還沒到達(dá)交換點,那么當(dāng)前線程將會被掛起,直至伙伴線程到達(dá)——完成交換正常返回;或者當(dāng)前線程被中斷——拋出中斷異常;又或者是等候超時——拋出超時異常。


注意的是,

線程1

obj1 = exchanger.exchange(obj1);

線程2

obj2= exchanger.exchange(obj2);


這樣對調(diào)的結(jié)果就是obj1 = obj2, obj2= obj1

在java中都是引用的交換


在下面的例子中,ReadThread交換之后的buffList就指向了null


import java.util.LinkedList; import java.util.List; import java.util.concurrent.Exchanger;public class ExchangerTest {public static void main(String[] args) {Exchanger<List<String>> exchanger = new Exchanger<List<String>>();new ReadThread(exchanger).start();// 啟動讀數(shù)據(jù)線程new WriteThread(exchanger).start();// 啟動寫數(shù)據(jù)線程}}class ReadThread extends Thread {private Exchanger<List<String>> exchanger;List<String> bufferList = new LinkedList<String>();public static final Integer BUFFER_SIZE = 10;public ReadThread(Exchanger<List<String>> exchanger) {this.exchanger = exchanger;}@Overridepublic void run() {System.out.println("ReadThread start");for (int i = 0; i < BUFFER_SIZE; i++) {bufferList.add(String.valueOf( (char)( 'A' + i))); // 模擬讀數(shù)據(jù)}try {Thread.sleep(3000);bufferList = exchanger.exchange(bufferList);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("ReadThread end");//System.out.println("buff size " + bufferList.size());} }class WriteThread extends Thread {private Exchanger<List<String>> exchanger;List<String> bufferList;public WriteThread(Exchanger<List<String>> exchanger) {this.exchanger = exchanger;}@Overridepublic void run() {try {System.out.println("WriteThread start");bufferList = exchanger.exchange(bufferList); // 從Exchanger獲得緩存數(shù)據(jù)} catch (InterruptedException e) {e.printStackTrace();}for (String str : bufferList) {System.out.println(str);}System.out.println("WriteTread end");} }



總結(jié)

以上是生活随笔為你收集整理的java.util.concurrent.Exchanger应用范例与原理浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。