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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)设置最大等待时长。

以上是关于Java并发工具类之线程间数据交换工具Exchanger的主要内容,如果未能解决你的问题,请参考以下文章

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

Java并发(十六):并发工具类——Exchanger

Java多线程同步工具类之Semaphore

Java并发工具类之CountDownLatch

Java并发工具类之并发数控制神器Semaphore

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