zoukankan      html  css  js  c++  java
  • Exchanger

    Exchanger


    可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给交换方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger可能被视为SynchronousQueue的双向形式.Exchanger可能在应用程序(比如遗传算法和管道设计)中很有用。

    Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。因此使用Exchanger的重点是成对的线程使用exchange()方法,当有一对线程达到了同步点,就会进行交换数据。因此该工具类的线程对象是成对的。

       Exchanger类提供了两个方法,String exchange(V x):用于交换,启动交换并等待另一个线程调用exchange;String exchange(V x,long timeout,TimeUnit unit):用于交换,启动交换并等待另一个线程调用exchange,并且设置最大等待时间,当等待时间超过timeout便停止等待。
    

    使用案例

    package my.syn;
    
    import java.util.concurrent.Exchanger;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * @ClassName: ExchangeThings
     * @author: Yang.X.P
     * @date: 2018-09-18 09:39
     **/
    public class ExchangeThings {
        public static void main(String[] args) {
            //建立一个线程池
            ExecutorService executor = Executors.newCachedThreadPool();
            //实例化一个exchange
            Exchanger exchanger = new Exchanger();
            //放了四个线程
            executor.execute(() -> {
                String thing1 = "手机";
                trade(thing1,exchanger);
            });
            executor.execute(() -> {
                String thing1 = "电脑";
                trade(thing1,exchanger);
            });
            executor.execute(() -> {
                String thing1 = "背包";
                trade(thing1,exchanger);
            });
            executor.execute(() -> {
                String thing1 = "平板";
                trade(thing1,exchanger);
            });
            executor.shutdown();
        }
    
        static void trade(String thing, Exchanger exchanger) {
            System.out.println(Thread.currentThread().getName() + "把" + thing + "交易出去");
            String getThing = null;
            try {
                //交换数据
                getThing = (String)exchanger.exchange(thing);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "得到了" + getThing);
        }
    }
    

    参考资料:

    http://cmsblogs.com/?p=2269

    http://brokendreams.iteye.com/blog/2253956

    https://blog.csdn.net/carson0408/article/details/79477280

  • 相关阅读:
    Spring Boot (20) 拦截器
    Spring Boot (19) servlet、filter、listener
    Spring Boot (18) @Async异步
    Spring Boot (17) 发送邮件
    Spring Boot (16) logback和access日志
    Spring Boot (15) pom.xml设置
    Spring Boot (14) 数据源配置原理
    Spring Boot (13) druid监控
    Spring boot (12) tomcat jdbc连接池
    Spring Boot (11) mybatis 关联映射
  • 原文地址:https://www.cnblogs.com/fruitknife/p/9703153.html
Copyright © 2011-2022 走看看