Java并发工具类之线程间数据交换工具Exchanger

  Exchanger是一个用于线程间协做的工具类,主要用于线程间的数据交换。它提供了一个同步点,在这个同步点,两个线程可以彼此交换数据。两个线程通过exchange方法交换数据,如果一个线程执行exchange方法,它就会等待另一个线程执行exchange方法,当两个线程都到达了同步点,这两个线程就可以交换数据。将本线程产生的数据传送给对方。

  Exchanger可用于工作的互相校对,比如我们要把线下产生的交易数据通过人工录入的方式添加到系统中,为了避免错误,我们采用AB两人同时录入的方式,当录入完成后,系统分别加载AB两人录入的数据,检查是否出错。

  模拟实例如下:

  

public class ExchangerTest {

    //定义交换器
    private static final Exchanger<String> exchanger = new Exchanger<String>();
    private static ExecutorService threadPool = Executors.newFixedThreadPool(2);

    public static void main(String[] args){
        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                String strA = "a record data";
                try {
                    exchanger.exchange(strA);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    String strB = "b record data";
                    String strA= exchanger.exchange(strB);
                    System.out.println(strA.equals(strB));
                    exchanger.exchange(strB);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

  如果两个线程有一个没有执行exchange()方法,则会一直等待,如果担心有特殊情况发生,避免一直等待,可以使用exchange(V x,longtimeout,TimeUnit unit)设置最大等待时长。

原文地址:https://www.cnblogs.com/senlinyang/p/7856332.html