• 生产者消费者模式的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,"消费者"));
        }
    
    }
  • 相关阅读:
    点击回到顶部
    rem根据屏幕大小适配字体大小
    使用layui-tree美化左侧菜单,点击生成tab选项
    字符串
    mysql ORDER BY field(STATUS, 0,1) 根据字段特定排序问题
    js防止短时间内重复点击
    tp5 where a and (b or c)
    array_diff遇到的坑
    前端开发必配置:html5shiv.js和respond.min.js的作用说明!
    phpmailer QQ邮件发送
  • 原文地址:https://www.cnblogs.com/seanvon/p/4072012.html
Copyright © 2020-2023  润新知