在多线程并发时设置等待,等待另一线程运行到指定位置,并且交换数据。
使用构造函数Exchanger()创建对象。
在线程开始之后可以使用exchange(Object)方法控制当前线程等待,直到有另一个线程也调用该方法时交换数据,并继续执行。(此方法只支持两个线程之间的数据交换)
类似于买卖双方约定交易地点,其中一方先到之后等待另外一方,双方到齐之后一手交钱一手交货。
package com.milton.thread.util;
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* @author milton
*
*/
public class ExchangerTest {
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
final Exchanger<String> exchanger = new Exchanger<String>();
pool.execute(new Runnable() {
@Override
public void run() {
try {
String data1 = "zs";
System.out.println("线程" + Thread.currentThread().getName()+ "把数据{" + data1 + "} 换出去");
String data2 = exchanger.exchange(data1);
System.out.println("线程" + Thread.currentThread().getName() + "交换回来的数据为{" + data2 + "}");
TimeUnit.SECONDS.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
pool.execute(new Runnable() {
@Override
public void run() {
try {
String data1 = "ls";
System.out.println("线程" + Thread.currentThread().getName() + "把数据{" + data1 + "}换出去");
String data2 = exchanger.exchange(data1);
System.out.println("线程" + Thread.currentThread().getName()+ "交换回来的数据为{" + data2 + "}");
TimeUnit.SECONDS.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
执行结果:
线程pool-1-thread-1把数据{zs} 换出去
线程pool-1-thread-2把数据{ls}换出去
线程pool-1-thread-1交换回来的数据为{ls}
线程pool-1-thread-2交换回来的数据为{zs}