Java并发编程之Exchanger

简介

Exchanger是一个用于线程间数据交换的工具类,它提供一个公共点,在这个公共点,两个线程能够交换彼此的数据。ide

当一个线程调用exchange方法后将进入等待状态,直到另一个线程调用exchange方法,双方完成数据交换后继续执行。工具

Exchanger的使用

方法介绍

exchange(V x):阻塞当前线程,直到另一个线程调用exchange方法或者当前线程被中断。线程

  • x : 须要交换的对象。

exchange(V x, long timeout, TimeUnit unit):阻塞当前线程,直到另一个线程调用exchange方法或者当前线程被中断或者等待超时。对象

  • x: 须要交换的对象。
  • timeout:超时时间。
  • unit:超时时间单位。

exchange方法正常状况返回交换到的对象,当当前线程被中断或者等待超时时,exchange方法返回null。string

示例1:A同窗和B同窗交换各自收藏的大片
public class Demo {
    public static void main(String[] args) {
        ExchangerstringExchanger = new Exchanger<>();

        Thread studentA = new Thread(() -> {
            try {
                String dataA = "A同窗收藏多年的大片";
                String dataB = stringExchanger.exchange(dataA);
                System.out.println("A同窗获得了" + dataB);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread studentB = new Thread(() -> {
            try {
                String dataB = "B同窗收藏多年的大片";
                String dataA = stringExchanger.exchange(dataB);
                System.out.println("B同窗获得了" + dataA);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        studentA.start();
        studentB.start();
    }
}

/*
 * 输出结果:
 * B同窗获得了A同窗收藏多年的大片
 * A同窗获得了B同窗收藏多年的大片
 */
示例2:A同窗被放鸽子,交易失败
public class Demo {
    public static void main(String[] args) {
        ExchangerstringExchanger = new Exchanger<>();

        Thread studentA = new Thread(() -> {
            String dataB = null;
            try {
                String dataA = "A同窗收藏多年的大片";
                //最多等待5秒
                dataB = stringExchanger.exchange(dataA, 5, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (TimeoutException ex){
                System.out.println("等待超时-TimeoutException");
            }

            System.out.println("A同窗获得了" + dataB);
        });

        studentA.start();
    }
}

/*
 * 输出结果:
 * 等待超时-TimeoutException
 * A同窗获得了null
 */
相关文章
相关标签/搜索