Java多线程_生产者消费者模式1
生产者消费者模型
具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。生产消费者模式如下图。(图片来自网络,侵删!)
生产者消费者模型的实现
生产者是一堆线程,消费者是另一堆线程,内存缓冲区可以使用List数组队列,数据类型只需要定义一个简单的类就好。关键是如何处理多线程之间的协作。这其实也是多线程通信的一个范例。
在这个模型中,最关键就是内存缓冲区为空的时候消费者必须等待,而内存缓冲区满的时候,生产者必须等待。其他时候可以是个动态平衡。值得注意的是多线程对临界区资源的操作时候必须保证在读写中只能存在一个线程,所以需要设计锁的策略。
具体实现:
import java.util.LinkedList; public class ProductorConsumerDemo {
LinkedList<Integer> lists = new LinkedList<>(); // 定义存放物品的仓库
int size = 10; // 定仓库的大小
// 生产物品
public synchronized void add(Integer i) { // 这里对临界资源的访问贯穿了整个方法,synchronized可以直接加到方法上
if (lists.size() == size) { // 首先判断还能不能生产? 也就是容量到了size吗?
try {
this.wait(); // 不需要的生产 ,就等待
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
lists.add(i); // 把生产出来的物品放进仓库
this.notifyAll(); // 唤醒消费者线程来消费
} } // 消费
public synchronized int remove() {
if (lists.size() == 0) { // 判断有没有物品
try {
this.wait(); // 如果没有物品就等待, 释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
int i = lists.removeFirst(); // 有物品,就拿走一个
if (lists.size() == 0) // 如果拿到了最后一个
{
this.notifyAll(); // 通知生产者生产物品
}
return i;
}
return -1;
} public static void main(String[] args) {
ProductorConsumerDemo pcd = new ProductorConsumerDemo();
new Thread(new Runnable() {
int count = 1; @Override
public void run() {
while (true) {
int i = count++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
pcd.add(i);
System.out.println(Thread.currentThread().getName() + " 生产了第 " + i + " 个物品,还有" + pcd.lists);
}
}
}, "生产者 ").start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(110);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 消费了第 " + pcd.remove() + "个物品");
}
}
}, "消费者 ").start();
}
}
结果:
这种方式很麻烦,在我的下一条博客中将介绍一种简单的实现方法。
Java多线程_生产者消费者模式1的更多相关文章
- Java多线程_生产者消费者模式2
在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...
- Java多线程-----实现生产者消费者模式的几种方式
1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...
- 【多线程】java多线程实现生产者消费者模式
思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...
- JAVA多线程之生产者 消费者模式 妈妈做面包案例
创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包 最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...
- Java多线程编程——生产者-消费者模式(1)
生产者-消费者模式在生活中非常常见.就拿我们去餐馆吃饭为例.我们会遇到以下两种情况: 1.厨师-客人 如下图所示,生产者.消费者直接进行交互. 生产者生产出产品后,通知消费者:消费者消费后,通知生产者 ...
- java多线程解决生产者消费者问题
import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...
- 【多线程】--生产者消费者模式--Lock版本
在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...
- Java设计模式之生产者消费者模式
Java设计模式之生产者消费者模式 博客分类: 设计模式 设计模式Java多线程编程thread 转载 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一 ...
- java多线程模拟生产者消费者问题,公司面试常常问的题。。。
package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 // ...
随机推荐
- 7月30日 举办专注于微服务的.NET Conf Focus
2020 年 7 月 30 日, 由.NET基金会和微软 将举办一个在线和为期一天的活动,包括 微软 .NET 团队的演讲者以及社区的演讲者.本次在线大会 专注.NET框架构建微服务,演讲者分享构建和 ...
- 5.19 省选模拟赛 小B的夏令营 概率 dp 前缀和优化dp
LINK:小B的夏令营 这道题是以前从没见过的优化dp的方法 不过也在情理之中. 注意读题 千万不要像我这个sb一样 考完连题意都不知道是啥. 一个长方形 要求从上到下联通的概率. 容易发现 K天只是 ...
- Redis服务之常用配置(三)
上一篇博客我们聊了下redis的rdb持久化.安全连接.资源限制相关配置;回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/13394411.html;今天我们来 ...
- vmware15虚拟机安装教程
自己碰到的问题:本人win7 64位旗舰版系统.之前用VMware12pro版本的软件,在安装Ubuntu18.04之后,有时候开启Ubuntu虚拟机时有点问题,重启就可以了.但是不稳定,所以改用VM ...
- Angular 10材质的模态弹出示例和教程
在本教程中,我们将通过示例使用Angular 10材质构建模式弹出窗口. 在这里,我们将研究创建Angular 10项目,安装和设置Angular 10材质,以及创建自定义材质模块文件. 在本教程中, ...
- 【BZOJ3307】雨天的尾巴 题解(树链剖分+树上差分)
题目链接 题目大意:给定一颗含有$n$个结点的树,每次选择两个结点$x$和$y$,对从$x$到$y$的路径上发放一带$z$类型的物品.问完成所有操作后每个结点发放最多的时哪种物品. 普通的树链剖分貌似 ...
- OpenCL 增强单work-item kernel性能策略
1.基于反馈的Optimization Report解决单个Work-item的Kernel相关性 在许多情况下,将OpenCL™应用程序设计为单个工作项内核就足以在不执行其他优化步骤的情况下最大化性 ...
- python深挖65万人的明星贴吧,探究上万个帖子的秘密
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 最近一直在关注百度明星吧,发现很多有趣的帖子,于是我就想用python把这 ...
- javascript函数的笔记
1.函数的概念 封装一段可以被重复调用执行的代码块来实现大量代码的重复使用 2.函数的使用分为两步:声明函数 和 调用函数 3.声明函数的关键字全部是小写 4.函数名一 ...
- image classification backbone 汇总分析
下面是一个list,可以详细看一下 image_classification = [['name','top1_acc','top5_acc','size'],['FixEfficientNet-L2 ...