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生产消费者模型——代码解析
我们将生产者.消费者.库存.和调用线程的主函数分别写进四个类中,通过抢夺非线程安全的数据集合来直观的表达在进行生产消费者模型的过程中可能出现的问题与解决办法. 我们假设有一个生产者,两个消费者来共同抢 ...
随机推荐
- 【原创】Hacker学习发展流程图 V1.0
这两张Hacker学习发展流程图都来自A1PASS之手,V0.2为2009推出的,V1.0为2015推出,在这里保存这两张图作为自己学习的方向,希望自己有朝一日也能成为IT大牛!!!
- mysql常用字符串操作函数大全,以及实例
今天在论坛中看到一个关于mysql的问题,问题如下 good_id cat_id12654 665,56912655 601,4722 goods_id是商品i ...
- Python机器学习笔记 K-近邻算法
K近邻(KNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一. 所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.KNN算法的 ...
- SpringBoot(11) SpringBoot自定义拦截器
自定义拦截器共两步:第一:注册.第二:定义拦截器. 一.注册 @Configuration 继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本) 旧版本代码 ...
- JavaScript中常见的十五种设计模式
在程序设计中有很多实用的设计模式,而其中大部分语言的实现都是基于“类”. 在JavaScript中并没有类这种概念,JS中的函数属于一等对象,在JS中定义一个对象非常简单(var obj = {}), ...
- iOS网络请求-AFNetworking源码解析
趁着端午节日,自己没有什么过多的安排,准备花4-5天左右,针对网络请求源码AFNetworking和YTKNetwork进行解析以及这两年多iOS实际开发经验(其实YTKNetwork也是对AFNet ...
- 脚本解决.NET MVC按钮重复提交问题
见于:Avoiding Duplicate form submission in Asp.net MVC by clicking submit twice 脚本代码: $(document).on(' ...
- 深入理解JAVA中的NIO
前言: 传统的 IO 流还是有很多缺陷的,尤其它的阻塞性加上磁盘读写本来就慢,会导致 CPU 使用效率大大降低. 所以,jdk 1.4 发布了 NIO 包,NIO 的文件读写设计颠覆了传统 IO 的设 ...
- Java中的深克隆和浅克隆
为什么要克隆 首先思考一个问题, 为什么需要克隆对象? 直接new一个对象不行吗? 克隆的对象可能包含一些已经修改过的属性, 而new出来的对象的属性都还是初始化时候的值, 所以当需要一个新的对象来保 ...
- 课程作业——Python基础之使用turtle库画出红旗
代码如下: import turtle # 设置画笔和背景颜色 turtle.color('yellow') turtle.bgcolor('red') # 通过偏移量和尺寸大小画星星 def dra ...