消费者和生产者模式

用继承Thread方式,用wait和notifyAll方法实现。

消费者和生产者模式的特点

1. 什么时候生产:仓库没有满的时候,生产者这可以生产,消费者也可以消费,仓库满的时候停止生产
2. 什么时候消费: 仓库有货的时候消费,没有货不能消费
3. 通知生产:消费者发现没有货,消费者通知生产者生产
4. 通知消费:生产者生产出产品后,通知消费者消费

代码实现

package com.java.javabase.thread.base;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;/*1. 什么时候生产:仓库没有满的时候,生产者这可以生产,消费者也可以消费,仓库满的时候停止生产2. 什么时候消费: 仓库有货的时候消费,没有货不能消费3. 通知生产:消费者发现没有货,消费者通知生产者生产4. 通知消费:生产者生产出产品后,通知消费者消费*/
@Data
@Slf4j
@AllArgsConstructor
@RequiredArgsConstructor
class Dept {private int capacity;private int size;/*@param val 是生产的产品数量*/public synchronized void produce(int val) {//int remainder = val;while (remainder > 0) {if (size >= capacity) {try {//仓库满了,等待不在执行生产wait();} catch (InterruptedException e) {e.printStackTrace();}}int incre = (size + remainder) > capacity ? capacity - size : remainder;size += incre;remainder -= incre;log.info("produce {} .depet increment {}, remainder {} ,current size is {}",val,incre, remainder, size);//结束生产,通知消费或者生产notifyAll();}}public synchronized void custom(int val) {int remainder = val;while(remainder>0){if(size<=0){try {//仓库无货,等待不在消费wait();} catch (InterruptedException e) {e.printStackTrace();}}int descre =(size<remainder)?size:remainder;size -=descre;remainder -=descre;log.info("custom {}. depet descrement {}, remainder {} ,current size is {}",val,descre, remainder, size);//结束消费,通知消费或者生产notifyAll();}}
}@AllArgsConstructor
class Producer {private Dept dept;public void produce(final int val) {new Thread() {@Overridepublic void run() {dept.produce(val);}}.start();}}@AllArgsConstructor
class Custom {private Dept dept;public void custom(final int val) {new Thread() {@Overridepublic void run() {dept.custom(val);}}.start();}}public class DemoProCustomTest {public static void main(String[] args) {Dept dept =new Dept(100,0);Producer producer =new Producer(dept);Custom custom =new Custom(dept);producer.produce(100);producer.produce(190);custom.custom(150);custom.custom(80);}
}

日志结果输出

因为多线程,所以下面的结果只是其中之一的可能性

2019-07-31 19:10:13,297   [Thread-0] INFO  Dept  - produce 100 .depet increment 100, remainder 0 ,current size is 100
2019-07-31 19:10:13,299   [Thread-3] INFO  Dept  - custom 80. depet descrement 80, remainder 0 ,current size is 20
2019-07-31 19:10:13,299   [Thread-2] INFO  Dept  - custom 150. depet descrement 20, remainder 130 ,current size is 0
2019-07-31 19:10:13,300   [Thread-1] INFO  Dept  - produce 190 .depet increment 100, remainder 90 ,current size is 100
2019-07-31 19:10:13,300   [Thread-2] INFO  Dept  - custom 150. depet descrement 100, remainder 30 ,current size is 0
2019-07-31 19:10:13,300   [Thread-1] INFO  Dept  - produce 190 .depet increment 90, remainder 0 ,current size is 90
2019-07-31 19:10:13,300   [Thread-2] INFO  Dept  - custom 150. depet descrement 30, remainder 0 ,current size is 60

转载于:https://www.cnblogs.com/JuncaiF/p/11281820.html

java并发:初探消费者和生产者模式相关推荐

  1. java并发初探ConcurrentSkipListMap

    java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...

  2. java并发初探ConcurrentHashMap

    java并发初探ConcurrentHashMap Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力. 1.8中ConcurrentHas ...

  3. java并发初探ThreadPoolExecutor拒绝策略

    java并发初探ThreadPoolExecutor拒绝策略 ThreadPoolExecuter构造器 corePoolSize是核心线程池,就是常驻线程池数量: maximumPoolSize是最 ...

  4. java并发初探CyclicBarrier

    java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...

  5. java并发初探CountDownLatch

    java并发初探CountDownLatch CountDownLatch是同步工具类能够允许一个或者多个线程等待直到其他线程完成操作. 当前前程A调用CountDownLatch的await方法进入 ...

  6. java并发初探ReentrantWriteReadLock

    java并发初探ReentrantWriteReadLock ReenWriteReadLock类的优秀博客 ReentrantReadWriteLock读写锁详解 Java多线程系列--" ...

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

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

  8. Java并发编程实战~Worker Thread模式

    在上一篇文章中,我们介绍了一种最简单的分工模式--Thread-Per-Message 模式,对应到现实世界,其实就是委托代办.这种分工模式如果用 Java Thread 实现,频繁地创建.销毁线程非 ...

  9. java copy-on-write_[Java并发-18-并发设计模式] COW模式:Copy-on-Write模式的应用领域

    在上一篇文章中我们讲到 Java 里 String 这个类在实现 replace() 方法的时候,并没有更改原字符串里面 value[] 数组的内容,而是创建了一个新字符串,这种方法在解决不可变对象的 ...

最新文章

  1. mysql文件头标记_通过文件头准确识别PHP上传的文件类型 ( 一 )
  2. 什么是第三方物流管理?如何套用模板进行绘制
  3. Hyperledger Fabric 超级账本的硬伤
  4. Call to undefined function Workerman\posix_getpid
  5. html特殊文字效果,HTML几个特殊的属性标签的使用介绍
  6. gitlab更新配置无效_GitMaster 发布 v1.11.0 版本,支持 GitLab 多级分组,Gist支持文件列表...
  7. java四连环游戏编程_Java实现四连环棋游戏
  8. 0x123C语言,and esp, 0xfffffff0
  9. PS将两张图像合成为一张
  10. 处理 ODBC, OLE DB, 和 SQL Server .NET Provider 中的异常
  11. linux之解决lib***.so.*: cannot open shared object file
  12. 常用的开源中文分词工具
  13. java爬虫(爬取豆瓣电影排行榜)
  14. Python 实现查找1000以内的质数
  15. MySQL:Impossible WHERE noticed after reading const tables
  16. 在mtk移植个linux内核,移植 Linux Kernel 造成無法開機之解決方案以及除錯工具
  17. 数据库修改密码的几种方法
  18. 斐讯(Phicomm)空气检测仪(悟空 M1)通过 EasyLink 安卓客户端同步时间方法
  19. java中word导入数据库
  20. 灵活运用CSS开发技巧(转载)

热门文章

  1. 面向java开发者的函数式编程_函数式编程让你忘记设计模式
  2. java 证书公钥 私钥_java#keytool#生成私钥证书库、公钥证书库
  3. Statefulset:部署有状态的多副本应用
  4. 英语流利说 第32天
  5. luogu1082 [NOIp2012]同余方程 (扩展欧几里得)
  6. FIle类常用工具方法整理(持续更新)
  7. 又一家药企IPO被拒,原因竟然是……
  8. 喵哈哈村的魔法考试 Round #1 (Div.2) C 喵哈哈村的魔法石(II) 背包dp
  9. BP的matlab实现
  10. python去掉数字列表中括号_如何从列表中的元素中移除括号(Python)