zoukankan      html  css  js  c++  java
  • java高级---->Thread之Exchanger的使用

      Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。今天我们就通过实例来学习一下Exchanger的用法。

    Exchanger的简单实例

      Exchanger是在两个任务之间交换对象的栅栏,当这些任务进入栅栏时,它们各自拥有一个对象。当他们离开时,它们都拥有之前由对象持有的对象。它典型的应用场景是:一个任务在创建对象,这些对象的生产代价很高昂,而另一个任务在消费这些对象。通过这种方式,可以有更多的对象在被创建的同时被消费。

    一、Exchanger的简单使用

    package com.linux.huhx.concurreny;
    
    import java.util.concurrent.Exchanger;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class ExchangerTest {
        public static void main(String[] args) {
            ExecutorService executor = Executors.newCachedThreadPool();
            final Exchanger exchanger = new Exchanger();
            executor.execute(new Runnable() {
                String data1 = "Ling";
    
                @Override
                public void run() {
                    doExchangeWork(data1, exchanger);
                }
            });
    
            executor.execute(new Runnable() {
                String data1 = "huhx";
    
                @Override
                public void run() {
                    doExchangeWork(data1, exchanger);
                }
            });
            executor.shutdown();
        }
    
        private static void doExchangeWork(String data1, Exchanger exchanger) {
            try {
                System.out.println(Thread.currentThread().getName() + "正在把数据 " + data1 + " 交换出去");
                Thread.sleep((long) (Math.random() * 1000));
    
                String data2 = (String) exchanger.exchange(data1);
                System.out.println(Thread.currentThread().getName() + "交换数据 到  " + data2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    运行结果如下:不固定

    pool-1-thread-1正在把数据 Ling 交换出去
    pool-1-thread-2正在把数据 huhx 交换出去
    pool-1-thread-2交换数据 到  Ling
    pool-1-thread-1交换数据 到  huhx

    当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行。

    友情链接

  • 相关阅读:
    POJ 1328 Radar Installation
    POJ 1700 Crossing River
    POJ 1700 Crossing River
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3069 Saruman's Army(贪心)
    poj 3069 Saruman's Army(贪心)
    Redis 笔记与总结2 String 类型和 Hash 类型
    数据分析方法有哪些_数据分析方法
    数据分析方法有哪些_数据分析方法
  • 原文地址:https://www.cnblogs.com/huhx/p/baseusejavaExchanger.html
Copyright © 2011-2022 走看看