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生产消费者模型——代码解析
我们将生产者.消费者.库存.和调用线程的主函数分别写进四个类中,通过抢夺非线程安全的数据集合来直观的表达在进行生产消费者模型的过程中可能出现的问题与解决办法. 我们假设有一个生产者,两个消费者来共同抢 ...
随机推荐
- web进修之—Hibernate HQL(7)
概述 HQL是Hibernate封装成为面向对象的数据库查询语言,具有如下特点: 面向对象,包括继承.多态和关联之类的概念,SQL操作的数据库的表,HQL更像是操作对象 大小写敏感,只对对象和属性敏感 ...
- VC连接MySql
VC连接MySql 一丶MySql 需要了解的知识 VC连接MySql 需要了解几个关键的API: MYSQL * stdcall mysql init (MYSQL *mysql): 初始化一个数 ...
- Spring-WebSocket 教程
WebSocket 教程 概述 WebSocket 是什么? WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 开始提供的一种在单个 T ...
- (void) (&_x == &_y)的作用
如果有下面这段代码: #define min(x, y) ({ \ const typeof(x) _x = (x); \ const typeof(y) _y = (y); \ (void) (&a ...
- Gitlab仓库搭建及在linux/windows中免密使用gitlab(二)--技术流ken
Gitlab简介 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的 ...
- YARN集群的mapreduce测试(四)
将手机用户使用流量的数据进行分组,排序: 测试准备: 首先同步时间,然后master先开启hdfs集群,再开启yarn集群:用jps查看: master上: 先有NameNode.SecondaryN ...
- js绑定下拉框
---恢复内容开始--- 方法一 js-ajax部分 function GetDListOfCt() { $.ajax({ url: "../../Ajax/Boss_Show.ashx?t ...
- ife2018 零基础学院 day 4
第四天,背景边框列表链接和更复杂的选择器 背景,边框,列表,链接相关属性 背景 MDN 背景 W3School 背景 元素的背景是指,在元素内容.内边距和边界下层的区域. 属性 描述 backgrou ...
- [转]nodeJS中redis初步使用
本文转自:https://blog.csdn.net/frankenjoy123/article/details/55209637 Node.js下使用Redis,首先: 1.有一台安装了Redis的 ...
- C#泛型。
作用: 使用泛型可以实现算法重用. class Program { static void Main(string[] args) { MyClass<string> myClass = ...