使用 BlockingQueue 实现生产者消费者模式

public class ProducerConsumerModel2 {

    private static BlockingQueue queue = new ArrayBlockingQueue<>(5);public static void main(String[] args) throws InterruptedException {        CountDownLatch countDownLatch = new CountDownLatch(100);        Runnable producer = () -> {try {                queue.put("数据");                System.out.println("生产数据...");            } catch (InterruptedException e) {                e.printStackTrace();            } finally {                countDownLatch.countDown();            }        };        Runnable consumer = () -> {try {                String product = queue.take();                System.out.println("消费" + product + "..");            } catch (InterruptedException e) {                e.printStackTrace();            } finally {                countDownLatch.countDown();            }        };        IntStream.rangeClosed(1, 50).forEach(i -> {            CompletableFuture.runAsync(producer);            CompletableFuture.runAsync(consumer);        });        countDownLatch.await();    }}

使用 wait 和 notify 实现生产者消费者模式

public class ProducerConsumerModel {    public static void main(String[] args) {        EventStorage eventStorage = new EventStorage();        Producer producer = new Producer(eventStorage);        Consumer consumer = new Consumer(eventStorage);

        new Thread(producer).start();        new Thread(consumer).start();    }

    static class Producer implements Runnable {        private EventStorage storage;

        public Producer(EventStorage storage) {            this.storage = storage;        }

        @Override        public void run() {            for (int i = 0; i 100; i++) {                storage.put(i);            }        }    }

    static class Consumer implements Runnable {        private EventStorage storage;

        public Consumer(EventStorage storage) {            this.storage = storage;        }

        @Override        public void run() {            for (int i = 0; i 100; i++) {                storage.take(i);            }        }    }

    static class EventStorage {        private int size;        private LinkedList storage;public EventStorage() {            size = 10;            storage = new LinkedList<>();        }public synchronized void put(int i) {while (storage.size() == this.size) {try {                    wait();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            storage.push("数据" + i);            System.out.println("生产 -> 数据" + i + " 当前仓库中已经有了 " + storage.size() + " 条数据");            notify();        }public synchronized void take(int i) {while (storage.size() == 0) {try {                    wait();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            System.out.println("消费 -> " + storage.poll() + " 当前仓库中剩下 " + storage.size() + " 条数据");            notify();        }    }}

源码地址:https://github.com/mirrormingzZ/JavaInterview


生产者消费者_【Java面试】实现生产者消费者模式相关推荐

  1. java 基础面试 英文_[Java面试] 面试java基础总结大全

    原标题:[Java面试] 面试java基础总结大全 基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. ...

  2. Java面试遇到的工厂模式

    参考:https://blog.csdn.net/ithouse/article/details/93590797 工厂模式和抽象工厂模式的区别,以及如何实现 1.工厂方法模式只有一个抽象产品类,而抽 ...

  3. java 消费者模式 多线程_[Java并发-24-并发设计模式] 生产者-消费者模式,并发提高效率...

    生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式. 当然,除了 ...

  4. java多线程生产者与消费者案例_多线程操作实例——生产者与消费者

    面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者- ...

  5. java consumed_Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的 真实世界中的生产者消费者模式 生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系.比如一个人正在准备食物(生产者),而另一个人正在吃(消费者) ...

  6. 生产者消费者--TestPC.java

    package org.shw.pc; public class TestPC {public static void main(String[] args) { Info info = new In ...

  7. java生产者消费者代码_Java实现Kafka生产者消费者代码实例

    Kafka的结构与RabbitMQ类似,消息生产者向Kafka服务器发送消息,Kafka接收消息后,再投递给消费者. 生产者的消费会被发送到Topic中,Topic中保存着各类数据,每一条数据都使用键 ...

  8. java中的生产者消费者模式详解

    方式 一: Synchronized方式 注:此种方式会造成资源的浪费: 利用锁的notifyAll()方法会将所有的线程都唤醒,会造成资源的浪费 class Resource {private St ...

  9. JAVA线程之生产者消费者问题

    复习下JAVA线程基础知识: 1.线程的状态: 创建状态:创建了线程对象,此时线程有了相应的内存空间和其他资源,但处于不可运行状态. 就绪状态:线程对象调用start()方法启动线程,进入就绪状态,此 ...

  10. delphi生产者消费者模式代码_并发设计模式:生产者-消费者模式,并发提高效率...

    生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式. 当然,除了 ...

最新文章

  1. 云迹科技:站在酒店场景服务机器人的风口
  2. linux中sh+$0,浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释
  3. Tomcat输出catalina.out的大小控制
  4. oracle 10741 trace,RedHat5.3上安装Oracle 10.2.0.1
  5. 推荐一些数据挖掘和生信友好的SCI!
  6. 9206 1225 mybank系统 随堂笔记
  7. 程序员面试被问到“三次握手,四次挥手”怎么办?
  8. java方法被编译器调用_我异常了,快来捕获我,Java异常简述
  9. Makefile中关于all和.PHONY
  10. JavaScript学习指南 修订版pdf
  11. matlab画圆的命令_matlab画矩形和matlab画圆
  12. matlabGUI入门
  13. 关于iPhone5耳机一个响解决办法(部分原因)
  14. 如何将lvm卷移动到另一台服务器中
  15. 计算机机房普通照明,计算机机房对照明的要求
  16. abp viewmodel的写法
  17. Docker测试环境笔记
  18. 【论文阅读】Scene Text Image Super-Resolution in the Wild
  19. 【CSS】css3绘制各种形状图形三角形,菱形,五角星,椭圆等
  20. LINUX内核第一霸

热门文章

  1. 医药/医疗/互联网医疗平台/问诊/挂号/开药/处方/复诊/患者管理/开药问诊/视频问诊/电话问诊/图文问诊/医生端/医师认证/医院/药品/续方/常用处方/电子处方/抢单/接诊/退诊/预约/科室/开方
  2. 使用Github官方提供的gitignore过滤Git提交的文件
  3. Python【第一篇】python安装、pip基本用法、变量、输入输出、流程控制、循环
  4. .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列
  5. GrapeCity Documents for Excel 与 Apache POI 功能对比
  6. 第一周-第11章节-Python3.5-if else流程判断
  7. The type 'System.Object' is defined in an assembly that is not referenced
  8. BZOJ.3524.[POI2014]Couriers(主席树)
  9. Nginx实用教程(二):配置文件入门
  10. Node buffer