Exchanger可以实现两个线程之间的数据交换,每个线程在完成一定的事务后想与对方交换数据,一个先拿出数据的线程将一直等待第二个线程拿着数据到来时,才能彼此交换数据。
通过代码看一下Exchanger的执行效果
- 1-1 一个Exchanger线程交换数据的例子
- import java.util.concurrent.Exchanger;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class ExchangerTest {
- public static void main(String[] args) {
- ExecutorService service = Executors.newCachedThreadPool();
- final Exchanger<String> exchanger = new Exchanger<String>();
- service.execute(new Runnable(){//启动一个线程
- public void run() {
- try {
- String data1 = "zxx";
- System.out.println("线程" + Thread.currentThread().getName() +
- "正在把数据" + data1 +"换出去");
- Thread.sleep((long)(Math.random()*10000));//在交换数据之前,随机等待一段时间
- String data2 = (String)exchanger.exchange(data1);//先到的线程等到后到的
- System.out.println("线程" + Thread.currentThread().getName() +
- "换回的数据为" + data2);
- }catch(Exception e){
- }
- }
- });
- service.execute(new Runnable(){//另外一个线程
- public void run() {
- try {
- String data1 = "lhm";
- System.out.println("线程" + Thread.currentThread().getName() +
- "正在把数据" + data1 +"换出去");
- Thread.sleep((long)(Math.random()*10000));//在交换数据之前,随机等待一段时间
- String data2 = (String)exchanger.exchange(data1);//两个线程都到时,操开始交换数据
- System.out.println("线程" + Thread.currentThread().getName() +
- "换回的数据为" + data2);
- }catch(Exception e){
- }
- }
- });
- }
- }
程序的运行效果如下: