简介

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

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

exchanger的使用

方法介绍

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

  1. x : 需要交换的对象。

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

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

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

示例1:a同学和b同学交换各自收藏的大片

public class demo {
    public static void main(string[] args) {
        exchanger<string> stringexchanger = 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) {
        exchanger<string> stringexchanger = 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
 */

到此这篇关于java并发编程之exchanger方法详解的文章就介绍到这了,更多相关java并发编程exchanger内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!