Exchanger 使用
Exchanger(java.util.concurrent包的类),从名字上理解就是交换。它用于在两个线程之间进行交换数据。线程会阻塞在Exchanger的exchange方法上,知道另一个线程也到了同一个Exchanger的exchange方法时,二者进行交换,然后两个线程会继续执行自身相关的代码。
如上图,无论谁先到达exchanger.exchange,都会等待另一个线程也到达,然后进行数据交换,继续向下执行。
下边结合一个例子可以让我们快速了解这个类的使用:
public class TestExchanger {
public static void main(String[] args) {
final Exchanger<List<Integer>> changer = new Exchanger<List<Integer>>();
new Thread("A"){
public void run() {
List<Integer> l1 = new ArrayList<>();
l1.add(1);
l1.add(2);
try {
l1 = changer.exchange(l1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.err.println("线程: " + Thread.currentThread().getName() + " " + l1);
}
}.start();
new Thread("B"){
public void run() {
List<Integer> l2 = new ArrayList<>();
l2.add(3);
l2.add(4);
try {
l2 = changer.exchange(l2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.err.println("线程: " + Thread.currentThread().getName() + " " + l2);
}
}.start();
}
}
运行结果:
线程: B [1, 2]
线程: A [3, 4]