Exchanger(交換者)是一個(gè)用于線程間協(xié)作的工具類。Exchanger 用于進(jìn)行 線程間的數(shù)據(jù)交換。它提供一個(gè)同步點(diǎn),在這個(gè)同步點(diǎn),兩個(gè)線程可以交換彼此 的數(shù)據(jù)。這兩個(gè)線程通過(guò) exchange 方法交換數(shù)據(jù),如果第一個(gè)線程先執(zhí)行 exchange()方法,它會(huì)一直等待第二個(gè)線程也執(zhí)行 exchange 方法,當(dāng)兩個(gè)線程都 到達(dá)同步點(diǎn)時(shí),這兩個(gè)線程就可以交換數(shù)據(jù),將本線程生產(chǎn)出來(lái)的數(shù)據(jù)傳遞給對(duì) 方。

示例:
/**
*類說(shuō)明:演示Exchange用法
*/
public class UseExchange {
private static final Exchanger>exchange =new Exchanger>();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
? ? ? ? ? ? public void run() {
? ? ? ? ? ? ? Set<String> setA = new HashSet<String>();//存放數(shù)據(jù)的容器
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? /*添加數(shù)據(jù)* set.add(.....)
* */
? ? ? ? ? ? ? ? ? setA = exchange.exchange(setA);//交換set
? ? ? ? ? ? ? ? ? /*處理交換后的數(shù)據(jù)*/
? ? ? ? ? ? ? ? } catch (InterruptedException e) {
}
}
? ? ? ? }).start();
new Thread(new Runnable() {
@Override
? ? ? ? ? ? public void run() {
? ? ? ? ? ? ? Set<String> setB = new HashSet<String>();//存放數(shù)據(jù)的容器
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? /*添加數(shù)據(jù)* set.add(.....)
* set.add(.....)
* */
? ? ? ? ? ? ? ? ? setB = exchange.exchange(setB);//交換set
? ? ? ? ? ? ? ? ? /*處理交換后的數(shù)據(jù)*/
? ? ? ? ? ? ? ? } catch (InterruptedException e) {
}
}
? ? ? ? }).start();
}
}