Exchanger是用于线程之间交换数据的工具类,它提供一个同步点,在这个同步点,两个线程可以彼此交换数据。这两个线程通过exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。
注意:Exchanger只能在两个线程之间交换数据,不支持更多的线程。
当线程A调用了Exchanger对象的exchange()方法后,会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行。
如果两个线程有一个没有执行exchange方法(),则会一直等待,如果担心有特殊情况发生,避免一直等待,可以使用exchange(V X ,long timeout,TimeUnit unit)设置最大等待时间。
public class MyExchanger {
public static void main(String[] args){
Exchanger<List<String>> exchanger=new Exchanger<List<String>>();
new Producer(exchanger).start();
new Consumer(exchanger).start();
}
}
class Producer extends Thread{
List<String> list=new ArrayList<String>();
Exchanger<List<String>> exchanger=null;
public Producer(Exchanger<List<String>> exchanger){
this.exchanger=exchanger;
}
@Override
public void run() {
super.run();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
list.add("ff");
try {
list= exchanger.exchange(list);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer extends Thread{
List<String> list=new ArrayList<String>();
Exchanger<List<String>> exchanger=null;
public Consumer(Exchanger<List<String>> exchanger){
this.exchanger=exchanger;
}
@Override
public void run() {
super.run();
try {
list= exchanger.exchange(list);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}