zoukankan      html  css  js  c++  java
  • 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)设置最大等待时长。

  • 相关阅读:
    selenium(七)expected_conditions EC
    Alpine Linux常用命令
    python logging模块,升级print调试到logging。
    用flask Flask-RESTful,实现RESTful API
    python,判断操作系统是windows,linux
    在docker hub,用github的dockerfile自动生成docker镜像
    解决pycharm问题:module 'pip' has no attribute 'main'
    alpine linux docker 安装 lxml出错的解决办法。
    (转载)服务端技术选型
    maven的pom文件
  • 原文地址:https://www.cnblogs.com/senlinyang/p/7856332.html
Copyright © 2011-2022 走看看