概述
Exchanger:交换器,用于线程间交换数据,他提供一个同步点,在这个同步点,两个线程可以交换数据
Exchanger通过exchange方法进行交换,如果线程A先执行exchange方法,他会一直等待线程B也执行exchange方法,当两个线程都到达同步点时,就会交互数据。
业务场景
有一个典型的例子,就是一手交钱,一手交货,假如A是绑匪,绑架了B的女儿,需要B交出一千万来换,双方约定在某时某地进行交换。
其中,A、B是两个线程,双方到时交换是一个同步点
实现
Exchanger():创建一个交换器
V exchange(V x):等待同步点进行交换
public class ExchangerTest {
public static void main(String[] args) {
final Exchanger<String> exchanger = new Exchanger<String>();
//线程A
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"--把A的钱交出去,等待交换...");
Thread.sleep((long) (Math.random() * 10000));
String exchange = exchanger.exchange("A的钱");
System.out.println(Thread.currentThread().getName()+"--A获得" + exchange);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
//线程B
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"--B把人质A的女儿交出去,等待交换...");
Thread.sleep((long) (Math.random() * 10000));
String exchange = exchanger.exchange("人质A的女儿");
System.out.println(Thread.currentThread().getName()+"--B获得" + exchange);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
输出结果
Thread-0--把A的钱交出去,等待交换...
Thread-1--B把人质A的女儿交出去,等待交换...
Thread-1--B获得A的钱
Thread-0--A获得人质A的女儿