zoukankan      html  css  js  c++  java
  • Java并发(十六):并发工具类——Exchanger

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

    举例

    class ExchangerTest {
    
        static class Producer implements Runnable {
    
            // 生产者、消费者交换的数据结构
            private List<String> buffer;
    
            // 步生产者和消费者的交换对象
            private Exchanger<List<String>> exchanger;
    
            Producer(List<String> buffer, Exchanger<List<String>> exchanger) {
                this.buffer = buffer;
                this.exchanger = exchanger;
            }
    
            @Override
            public void run() {
                for (int i = 1; i < 5; i++) {
                    for (int j = 1; j <= 3; j++) {
                        System.out.println("生产者装入" + i + "--" + j);
                        buffer.add("buffer:" + i + "--" + j);
                    }
    
                    System.out.println("生产者装满,等待与消费者交换...");
                    try {
                        exchanger.exchange(buffer);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.err.println("生产者 " + i + ":" + buffer);
                }
            }
        }
    
        static class Consumer implements Runnable {
            private List<String> buffer;
    
            private final Exchanger<List<String>> exchanger;
    
            public Consumer(List<String> buffer, Exchanger<List<String>> exchanger) {
                this.buffer = buffer;
                this.exchanger = exchanger;
            }
    
            @Override
            public void run() {
                for (int i = 1; i < 5; i++) {
                    // 调用exchange()与消费者进行数据交换
                    try {
                        buffer = exchanger.exchange(buffer);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                    System.out.println("消费者第" + i + "次提取");
                    for (int j = 1; j <= 3; j++) {
                        System.out.println("消费者 : " + buffer.get(0));
                        buffer.remove(0);
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            List<String> buffer1 = new ArrayList<String>();
            List<String> buffer2 = new ArrayList<String>();
    
            Exchanger<List<String>> exchanger = new Exchanger<List<String>>();
    
            Thread producerThread = new Thread(new Producer(buffer1, exchanger));
            Thread consumerThread = new Thread(new Consumer(buffer2, exchanger));
    
            producerThread.start();
            consumerThread.start();
        }
    }

    并发工具类(四)两个线程进行数据交换的Exchanger

    【死磕Java并发】—–J.U.C之并发工具类:Exchanger

  • 相关阅读:
    eclipse debug小技巧
    session.flush加锁测试.
    mac os x升级MOUNTAIN LION后svn command not found的解决
    Linux下vi命令大全(转)
    Java 集合框架
    java 实用类
    Java 输入/输出 反射
    Java 注解
    多线程(重点)
    多线程
  • 原文地址:https://www.cnblogs.com/hexinwei1/p/9984575.html
Copyright © 2011-2022 走看看