Exchanger
概念
线程可以在成对内配对和交换元素的同步点。每个线程在输入exchange方法时提供一些对象,与合作者线程匹配,并在返回时接收其合作伙伴的对象。交换器可以被视为一个的双向形式SynchronousQueue。交换器在诸如遗传算法和管道设计的应用中可能是有用的。
一个用于两个工作线程之间交换数据的封装工具类,简单说就是一个线程在完成一定的事务后想与另一个线程交换数据,则第一个先拿出数据的线程会一直等待第二个线程,直到第二个线程拿着数据到来时才能彼此交换对应数据。
Exchanger 泛型类型,其中 V 表示可交换的数据类型
- V exchange(V v):等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
- V exchange(V v, long timeout, TimeUnit unit):等待另一个线程到达此交换点(除非当前线程被中断或超出了指定的等待时间),然后将给定的对象传送给该线程,并接收该线程的对象。
案例
package com.dongguo.juc;
import java.util.Random;
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author Dongguo
* @date 2021/9/19 0019-11:34
* @description:
*/
public class ExchangerDemo {
public static void main(String[] args) {
Exchanger exchanger = new Exchanger();
ExecutorService executor = Executors.newCachedThreadPool();
//模拟两个线程组
for (int i = 1; i {
try {
int num = new Random().nextInt(10);
System.out.println(Thread.currentThread().getName() + "开始交换数据:" + num);
num = exchanger.exchange(num);//交换数据并得到交换后的数据
System.out.println(Thread.currentThread().getName() + "交换数据结束后的数据:" + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
executor.shutdown();
}
}
运行结果:
pool-1-thread-2开始交换数据:9
pool-1-thread-1开始交换数据:8
pool-1-thread-2交换数据结束后的数据:8
pool-1-thread-1交换数据结束后的数据:9