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();
}
}
}