Java中的生产消费者问题
package day190109; import java.util.LinkedList;
import java.util.Queue;
import java.util.Random; public class 生产消费者ThreadDemo10 {
public static void main(String[] args) {
//生产消费者模式
Queue<Phone> queue = new LinkedList<Phone>();
Producer producer = new Producer(queue,30);
Consumers consumers = new Consumers(queue,"李江萍");
Consumers consumers1 = new Consumers(queue,"熊天明"); producer.start();
consumers.start();
consumers1.start(); }
}
class Producer extends Thread{
public Queue<Phone> queue;
public int max;
//构造方法
public Producer(Queue<Phone> queue, int max) {
this.queue = queue;
this.max = max;
} @Override
public void run() {
while (true){
synchronized (queue) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (queue.size() == max) { //如果生产的商品满啦
try {
System.out.println("你好!本地库存产品已满!请通知消费之前来消费");
queue.wait();//先不忙生产,让消费者先消费
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
Random r = new Random();
Phone p = new Phone(r.nextInt(7), (double) r.nextInt(2000));
System.out.println("甲方已经生产了1个手机:" + p);
queue.offer(p);
System.out.println(" 生产后现在的库存是:" + queue.size()+"个");
queue.notifyAll();//通知消费者。可以消费啦
}
}
}
}
}
class Consumers extends Thread{
public Queue<Phone> queue;
public String name;
//构造方法
public Consumers(Queue<Phone> queue, String name) {
this.queue = queue;
this.name = name;
} @Override
public void run() {
while (true) {
synchronized (queue) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (queue.size() == 0) {
try {
System.out.println(this.name+"说:“你们本地库存产品严重不足”");
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
Phone p = queue.poll();
System.out.println(this.name + "说:我要买1个手机:" + p);
System.out.println(" 消费后现在的库存是:" + queue.size()+"个");
queue.notifyAll();//通知生产者可以生产了
}
}
}
}
}
class Phone{
private Integer size;
private Double price; public Phone(Integer size, Double price) {
this.size = size;
this.price = price; } @Override
public String toString() {
return "手机规格是{" +
"尺寸是:" + size +
", 价格是:" + price +"元"+
'}';
}
}
Java中的生产消费者问题的更多相关文章
- Java中生产者与消费者模式
生产者消费者模式 首先来了解什么是生产者消费者模式.该模式也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了两个共享固定大小缓冲区的线 ...
- Python - Asyncio模块实现的生产消费者模型
[原创]转载请注明作者Johnthegreat和本文链接 在设计模式中,生产消费者模型占有非常重要的地位,这个模型在现实世界中也有很多有意思的对应场景,比如做包子的人和吃包子的人,当两者速度不匹配时, ...
- Java多线程系列--“基础篇”11之 生产消费者问题
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
- Java多线程学习笔记--生产消费者模式
实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
- java中使用阻塞队列实现生产这与消费这之间的关系
需求如下: 有一个生产者和一个消费者,生产者不断的生产产品,消费这不断的消费产品.产品总数为N. 1.生产顺序按队列的方式,先进先出. 2.生产者和消费这可以同时进行. 3.当生产者生产了N个产品后不 ...
- Java中的生产者、消费者问题
Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...
- Java 中 wait, notify 和 notifyAll的正确使用 – 以生产者消费者模型为例
如何使用Wait 尽管关于wait和notify的概念很基础,它们也都是Object类的函数,但用它们来写代码却并不简单.如果你在面试中让应聘者来手写代码,用wait和notify解决生产者消费者问题 ...
- java 多线程系列基础篇(十一)之生产消费者问题
1. 生产/消费者模型 生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”.“消费者”.“仓库”和“产品”.他们之间的关系如下:(01) 生产者仅仅在仓储未满时候生产,仓满则停止生产 ...
- Java生产消费者模型——代码解析
我们将生产者.消费者.库存.和调用线程的主函数分别写进四个类中,通过抢夺非线程安全的数据集合来直观的表达在进行生产消费者模型的过程中可能出现的问题与解决办法. 我们假设有一个生产者,两个消费者来共同抢 ...
随机推荐
- 【SQL跟踪工具】SQL Profiler 跟踪器
什么是SQL Profiler SQL Server Profiler 是一个功能丰富的界面,用于创建和管理跟踪并分析和重播跟踪结果. 事件保存在一个跟踪文件中,稍后试图诊断问题时,可以对该文件进行分 ...
- Go语言学习笔记说明
参考书籍:<学习Go语言>.<Go语言编程> 程序运行环境:windows(64bit) Go语言版本:go1.0.2 资料: 1.Go语言半小时速成教程 http://w ...
- KeepAlived(三):vrrp实例故障转移(keepalived+haproxy)
keepalived使用脚本进行健康检查时的相关配置项.例如keepalived+haproxy实现haproxy的高可用. keepalived分为vrrp实例的心跳检查和后端服务的健康检查.如果要 ...
- 基于.Net进行前端开发的技术栈发展路线(一)
前言 今天想讲讲的是我的技术树.我最初是做CS开发的,第一阶段的技术经历是以Powerbuilder来做CS开发,第二阶段开始基于C#做winform开发,眼看前端开发越来越流行,需要更广泛的技术栈势 ...
- TensorFlow入门(一)
目录 TensorFlow简介 TensorFlow基本概念 Using TensorFlow Optimization & Linear Regression & Logistic ...
- [心得] 如何利用liquibase進行資料庫版本控制 - 基礎觀念
前言 - 會寫這篇除了是要記錄一下使用的過程之外,也是發現到網路上找來的教學幾乎都是跟其它環境做結合 比較沒有單純利用command進行的流程.也沒有整體觀念的介紹,所以將我所理解的整理分享給大家. ...
- C#基础知识总结(二)
摘要 第二篇主要讲:变量.连接符占位符等.转义字符.数据的计算.数据的转换.try-catch的简单熟悉.复合运算符和自加自减 一.变量 1.数据存储在内存中:内存叫做RAM,内存被分隔为一小格一小格 ...
- jqgrid中的column的日期格式
---恢复内容开始--- {name:'StartDate',index:'StartDate', formatter:"date", formatoptions: {newfor ...
- springMVC_06数据的处理
一.提交数据的处理 *springmvc是单例的 1. 提交的域名称和处理方法的参数一致即可 提交的数据 处理方法 2.如果域名城和参数名不一致,在方法内加上域名称eg.(RequestParam(“ ...
- App测试流程及测试点(个人整理版)
1 APP测试基本流程 1.1流程图 1.2测试周期测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间.正式测试前先向主 ...