Exchanger理解与运用

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 +
                '}';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值