zoukankan      html  css  js  c++  java
  • 生产者消费者模式的java实现(实现三)

      Exchanger是java.util.concurrent类库下的一个并发工具。下面是java api文档里对Exchanger的描述。

      A synchronization point at which threads can pair and swap elements within pairs. Each thread presents some object on entry to the exchange method, matches with a partner thread, and receives its partner's object on return. An Exchanger may be viewed as a bidirectional form of a SynchronousQueue. Exchangers may be useful in applications such as genetic algorithms and pipeline designs.

      也就是Exchanger必须是伴随一对线程出现。

    package com.smikevon.concurrent;
    
    import java.util.Random;
    import java.util.concurrent.Exchanger;
    import java.util.concurrent.Executor;
    import java.util.concurrent.Executors;
    
    /**
     * @description: 生产者消费者模式使用exchanger来实现
     * @date       : 2014年9月18日 下午4:28:49
     */
    public class ProducerConsumer_02 {
    
        static class Producer implements Runnable {
    
            private Exchanger<String> exchanger;
            private String name;
    
            public Producer(Exchanger<String> exchanger,String name){
                this.exchanger = exchanger;
                this.name = name;
            }
    
            public void run() {
                String[] messages = {
                    "我是",
                    "一名程序员",
                    "我很骄傲",
                    "也很自豪",
                    "爱岗敬业",
                    "勤劳奉献",
                    "无怨无悔",
                    "奉献青春",
                    "希望通过学习",
                    "提升",
                    "自己",
                    "done",
                };
                try {
                    for(int i=0;i<messages.length;i++){
                        System.out.format("%s: 放入信息-----------%s %n",name,messages[i]);
                        exchanger.exchange(messages[i]);
                        Thread.sleep(new Random(System.currentTimeMillis()).nextInt(5000));
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        static class Consumer implements Runnable{
    
            private Exchanger<String> exchanger;
            private String name;
    
            public Consumer(Exchanger<String> exchanger,String name){
                this.exchanger = exchanger;
                this.name = name;
            }
    
            public void run() {
                try {
                    String message = "";
                    do{
                        message = exchanger.exchange("");
                        System.out.format("%s: 取出信息-------------%s %n",name,message);
                        Thread.sleep(new Random(System.currentTimeMillis()).nextInt(5000));
                    }while(!message.equals("done"));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args){
            Executor executor = Executors.newCachedThreadPool();
            Exchanger<String> exchanger = new Exchanger<String>();
            executor.execute(new Producer(exchanger,"生产者"));
            executor.execute(new Consumer(exchanger,"消费者"));
        }
    
    }
  • 相关阅读:
    Qt ini文件
    Qt我的文档 桌面路径
    windows zlib库编译步骤
    环形缓冲区
    openssl生成随机数
    怎样安装Scrapy
    CentOS7怎样安装GoAccess1.3
    Docker创建数据卷容器
    Docker创建数据卷
    Docker创建容器
  • 原文地址:https://www.cnblogs.com/seanvon/p/4072012.html
Copyright © 2011-2022 走看看