博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java多线程系列15 设计模式 生产者 - 消费者模式
阅读量:5045 次
发布时间:2019-06-12

本文共 2308 字,大约阅读时间需要 7 分钟。

生产者-消费者 

  生产者消费者模式是一个非常经典的多线程模式,比如我们用到的Mq就是其中一种具体实现

  在该模式中 通常会有2类线程,消费者线程和生产者线程

 生产者提交用户请求 消费者负责处理生产者提交的任务,在消费者和生产者之间共享内存缓存区进行通信

  常见的实现 可以 通过 wait/notifyAll来  或者 阻塞队列来实现 下面我来演示下通过 wait/notifyAll 来实现。。。

下面是代码演示

public class Storage
{ LinkedList
list = new LinkedList<>(); private Integer maxSize; public Integer getMaxSize() { return maxSize; } public void setMaxSize(Integer maxSize) { this.maxSize = maxSize; } public T consumer() { synchronized (list) { if (list == null || list.size() == 0) { try { System.out.println(Thread.currentThread().getName() + " 等待 "); list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { T t = list.remove(); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " 消费 " + t); if (list.size() == 0) { // 消费完了 通知生产者 继续生产 list.notifyAll(); } return t; } } return null; } public void producer(T t) { synchronized (list) { if (list.size() == maxSize.intValue()) { System.out.println(Thread.currentThread().getName() + " 仓库已满 暂停生产 "); try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { list.add(t); System.out.println(Thread.currentThread().getName() + " 生产 " + t); list.notifyAll(); } } } public static void main(String[] args) { Storage
storage = new Storage<>(); storage.setMaxSize(5); AtomicInteger numberGenarnate = new AtomicInteger(0); ExecutorService consumerService = Executors.newCachedThreadPool(); for (int i = 0; i < 3; i++) { Runnable run = new Runnable() { @Override public void run() { while (true) { storage.consumer(); } } }; consumerService.submit(run); } for (int i = 0; i < 1; i++) { Runnable run = new Runnable() { @Override public void run() { while (true) { storage.producer(numberGenarnate.incrementAndGet()); } } }; consumerService.submit(run); } consumerService.shutdown(); }}

运行结果如下

 

  总结:对于消费者生产者模式 要理解其思想。实际开发中。mq(消息队列)就是典型的应用。

       对于mq这里多说几句,关于技术选型:::

       Mq适用于生产者生产很多   消费者处理不过来的情况 。如果消费者处理能力很强,就不要用mq了,直接使用nio框架(mina   or  netty

 

转载于:https://www.cnblogs.com/javabigdata/p/7028798.html

你可能感兴趣的文章
tomcat下部署多个项目
查看>>
Docker-Compose
查看>>
Python list知识内容
查看>>
C - A Plug for UNIX - poj 1087(最大流)
查看>>
UNICODE与ANSI的区别
查看>>
代码备份2
查看>>
工作流基本特性及说明
查看>>
高手给菜鸟学习Linux的10个建议
查看>>
洗牌算法Fisher_Yates原理
查看>>
functools 之 partial(偏函数)
查看>>
多线程2--毕向东基础视频教程学习笔记
查看>>
结对第二次作业
查看>>
jQuery 1.7的隐藏改动
查看>>
初学ant
查看>>
bzoj 4295 [PA2015]Hazard 贪心,暴力
查看>>
HTML5实践 -- 使用css装饰你的图片画廊
查看>>
软件工程总结
查看>>
解决PowerDesigner 16 Generate Datebase For Sql2005/2008 对象名sysproperties无效的问题
查看>>
learning ddr seft-refresh mode summary
查看>>
30款超酷的HTTP 404页面未找到错误设计
查看>>