消费者和生产者模式

用继承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() {
@Override
public void run() {
dept.produce(val);
}
}.start();
} } @AllArgsConstructor
class Custom {
private Dept dept; public void custom(final int val) {
new Thread() {
@Override
public 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

java并发:初探消费者和生产者模式的更多相关文章

  1. java多线程-消费者和生产者模式

    /* * 多线程-消费者和生产者模式 * 在实现消费者生产者模式的时候必须要具备两个前提,一是,必须访问的是一个共享资源,二是必须要有线程锁,且锁的是同一个对象 * */ /*资源类中定义了name( ...

  2. springcloud 实现简单的 消费者和生产者 模式(Restfule 的风格)

    一.springcloud 实现简单的 消费者和生产者 模式(Restfule 的风格) 1.实现简单的消费者和生产者 springcloud使用的http协议进行传输数据,也就是说springclo ...

  3. java并发初探ConcurrentSkipListMap

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

  4. java并发初探ConcurrentHashMap

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

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

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

  6. java并发初探CyclicBarrier

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

  7. java并发初探CountDownLatch

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

  8. java并发初探ReentrantWriteReadLock

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

  9. java 模拟实现消费者和生产者问题

    题目要求 用java代码模拟实现:一个人不断往箱子里放苹果,另一个人不断从箱子里取苹果,箱子只能放5个苹果,苹果数量无限.要求不使用java.util.concurrent包中的类. 思路 这道题主要 ...

随机推荐

  1. ASP.NET Core搭建多层网站架构【15-扩展之使用Obfuscar混淆加密保护代码】

    2020/02/03, ASP.NET Core 3.1, VS2019, Obfuscar 2.2.25 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[15-扩展之使 ...

  2. 关于浮动&关于BFC规范&whyoverflow清除浮动

    https://www.cnblogs.com/smivico/p/7656270.html 浮动 https://www.jianshu.com/p/4b93eecb090e BFC https:/ ...

  3. 为什么ISR4K、ASR1K等设备的QoS ACL没有显示计数?

    思科的ISR4K和ASR1K设备都是IOS XE的架构,它们和传统的IOS架构是不一样的. 以ISR4K为例,和一般的IOS(例如ISR G2)有所区别,他的转发更依赖硬件完成,针对NAT或QoS应用 ...

  4. Golang介绍以及安装

    Go语言 Google开源 编译形语言 21世纪的C语言 Go语言的特点 简单易并发 开发效率高 执行性能好 Go语言应用的领域 服务端开发 日志处理 文件系统 监控服务 容器虚拟化 Docker k ...

  5. 启动named服务报错!

    安装及配置bind服务程序: yum -y install bind 三个关键文件: 主配置文件(/etc/named.conf) 区域配置文件(/etc/named.rfc1912.zones) 数 ...

  6. 【Android多线程】异步信息处理机制

    https://www.bilibili.com/video/av65170691?p=3 (本文为此视频听课笔记) 一.线程和线程之间为什么要进行通讯 各线程之间要传递数据 二.线程和线程之间如何通 ...

  7. SVN 锁定无法提交命令执行失败

    有个项目使用svn 高版本客户端作业,转换到低版本的环境下,出现锁定,命令执行失败. 使用cleanup 没有效果, 网上建议的svn无法Cleanup解决方法: Step1:到 sqlite官网 ( ...

  8. Java自学-集合框架 ArrayList和HashSet的区别

    Java ArrayList和HashSet的区别 示例 1 : 是否有顺序 ArrayList: 有顺序 HashSet: 无顺序 HashSet的具体顺序,既不是按照插入顺序,也不是按照hashc ...

  9. C/C++网络编程9——多进程服务器端实现

    #include <iostream> #include <unistd.h> #include <cstdlib> #include <arpa/inet. ...

  10. 19年读100本书之第二本--《OKR工作法》-克里斯蒂娜 沃特克

    0,一句话概括书的内容? OKR(objective key result),即目标与关键结果. 1,我从这本书能得到什么? 2,核心内容是什么? 3,我要怎么做?