概念
Exchange主要是两个线程的数据交换,如果超过两个线程都不行
Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。
数据交换的过程中是线程安全的.
案例
import java
.util
.HashSet
;
import java
.util
.Set
;
import java
.util
.concurrent
.Exchanger
;
public class Demo01 {
private static final Exchanger
<Set
<String>> exchange
= new Exchanger<Set
<String>>();
public static void main(String
[] args
) {
new Thread(new Runnable() {
@Override
public void run() {
Set
<String> setA
= new HashSet<String>();
try {
for (int i
= 0; i
< 5; i
++) {
setA
.add("A线程添加的" + i
);
}
System
.out
.println("A线程的交换之前SetA里面的值 = " + setA
);
setA
= exchange
.exchange(setA
);
System
.out
.println("A线程的交换之后SetA里面的值 = " + setA
);
} catch (InterruptedException e
) {
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
Set
<String> setB
= new HashSet<String>();
try {
for (int i
= 0; i
< 5; i
++) {
setB
.add("B线程添加的" + i
);
}
System
.out
.println("B线程的交换之前SetB里面的值 = " + setB
);
setB
= exchange
.exchange(setB
);
System
.out
.println("B线程的交换之后SetB里面的值 = " + setB
);
} catch (InterruptedException e
) {
}
}
}).start();
}
}
仔细看控制台打印的结果A线程添加的值和B线程添加的值对换了 控制台打印的结果
A线程的交换之前SetA里面的值 = [A线程添加的4, A线程添加的2, A线程添加的3, A线程添加的0, A线程添加的1]
B线程的交换之前SetB里面的值 = [B线程添加的0, B线程添加的1, B线程添加的2, B线程添加的3, B线程添加的4]
B线程的交换之后SetB里面的值 = [A线程添加的4, A线程添加的2, A线程添加的3, A线程添加的0, A线程添加的1]
A线程的交换之后SetA里面的值 = [B线程添加的0, B线程添加的1, B线程添加的2, B线程添加的3, B线程添加的4]