Exchanger用于在两个线程之间进行数据交换,线程会阻塞在Exchanger的exchange方法上,知道另一个线程也到了同一个Exchanger的Exchange方法时,二者进行交换,然后两个线程会继续执行自身相关的代码。
例子:
package org.dyb.exchanger;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Exchanger;
public class Testexchanger {
public static void main(String[] args) {
final Exchanger<List<Integer>> exchanger = new Exchanger<>();
new Thread(){
@Override
public void run(){
List<Integer> l = new ArrayList<>();
l.add(1);
l.add(2);
try {
Thread.sleep(3000);
System.out.println("Thread1 arrival");
l = exchanger.exchange(l);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println("Thread1"+l);
}
}.start();
new Thread(){
@Override
public void run(){
List<Integer> l = new ArrayList<>();
l.add(4);
l.add(5);
try {
Thread.sleep(10000);
System.out.println("Thread2 arrival");
l = exchanger.exchange(l);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println("Thread2"+l);
}
}.start();
}
}
输出结果:
Thread1 arrival
Thread2 arrival
Thread1[4, 5]
Thread2[1, 2]
3s后线程进行等待,直到Thread2 arrival输出后数据进行交换然后打印出数据信息。