java.util.concurrent包中的Exchanger类可用于两个线程之间交换信息。可简单地将Exchanger对象理解为一
个包含两个格子的容器,通过exchanger方法可以向两个格子中填充信息。当两个格子中的均被填充时,该对象会
自动将两个格子的信息交换,然后返回给线程,从而实现两个线程的信息交换。
demo:
//需求:获取用户信息(1s)后将该用户创建订单。注:创建订单前还需要1s初始化一些信息
//同步逻辑:获取用户信息(1s)---同步--->订单信息初始化(1s)->创建订单
// 总耗时2s
//异步逻辑:A线程:获取用户信息(1s)---->将用户信息数据交换给B线程
// B线程:(异步)订单初始化(1s)---->与A线程进行数据交换---->创建订单
// 总耗时1s
//这里很明显看出使用异步处理速度快了1倍。下面给出示例代码:
import java.util.concurrent.Exchanger;
/**
* @Package com.xhxh.javabase.thread.exchangerlearn
* @Description
* @Author ttsx
* @Date 2019-07-29 14:11
*/
public class Test {
public static void main(String[] args) {
Exchanger<UserInfo> exchanger = new Exchanger<>();
new Thread(new UserInfoRPC(exchanger)).start();
new Thread(new OrderRPC(exchanger)).start();
}
}
class UserInfoRPC implements Runnable {
private Exchanger<UserInfo> exchanger;
public UserInfoRPC(Exchanger<UserInfo> exchanger) {
this.exchanger = exchanger;
}
//模拟调用远程API查用户信息
@Override
public void run() {
try {
System.out.println("Thread-name"+Thread.currentThread().getId()+"开始调用用户信息API"+"TIME="+System.currentTimeMillis());
//RPC time=1s 获取用户信息需要1s
Thread.sleep(1000);
UserInfo userInfo = new UserInfo("xiehua", 21);
System.out.println("Thread-name"+Thread.currentThread().getId()+"开始获取用户信息");
exchanger.exchange(userInfo);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class OrderRPC implements Runnable {
private Exchanger<UserInfo> exchanger;
public OrderRPC(Exchanger<UserInfo> exchanger) {
this.exchanger = exchanger;
}
@Override
public void run() {
try {
System.out.println("Thread-name"+Thread.currentThread().getId()+"开始调用创建订单API"+"TIME="+System.currentTimeMillis());
long l = System.currentTimeMillis();
//RPC time=1s 创建订单前的准备
Thread.sleep(1000);
UserInfo userInfo = new UserInfo();
//创建订单需要获取用户信息
UserInfo exchangeUserInfo = exchanger.exchange(userInfo);
//创建订单
if (exchangeUserInfo != null) {
System.out.println("Thread-name"+Thread.currentThread().getId()+"获取用户信息成功");
System.out.println("Thread-name"+Thread.currentThread().getId()+"创建订单成功");
System.out.println(exchangeUserInfo.toString());
} else {
System.out.println("Thread-name"+Thread.currentThread().getId()+"创建订单失败");
}
System.out.println(System.currentTimeMillis()-l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 用户信息类
*/
class UserInfo {
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
public UserInfo() {
}
public UserInfo(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "UserInfo{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}