一、整体代码

ThreadDemo.java

public  class ThreadDemo { public static void main(String[] args) { Godown godown = new Godown(0); Consumer c1 = new Consumer(50, godown); Consumer c2 = new Consumer(20, godown); Consumer c3 = new Consumer(30, godown); Producer p1 = new Producer(10, godown); Producer p2 = new Producer(10, godown); Producer p3 = new Producer(10, godown); Producer p4 = new Producer(10, godown); Producer p5 = new Producer(10, godown); Producer p6 = new Producer(10, godown); Producer p7 = new Producer(80, godown); c1.start(); c2.start(); c3.start(); p1.start(); p2.start(); p3.start(); p4.start(); p5.start(); p6.start(); p7.start(); }
} /**
* 仓库
*/
class Godown { public static final int max_size = 100; //最大库存量 public int curnum;     //当前库存量 Godown() { } Godown(int curnum) { this.curnum = curnum; } /** * 生产指定数量的产品 * * @param neednum */ public synchronized void produce(int neednum) { //测试是否需要生产 while (neednum + curnum > max_size) { System.out.println("要生产的产品数量" + neednum + "超过剩余库存量" + (max_size - curnum) + ",暂时不能执行生产任务!"); try { //当前的生产线程等待 wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //满足生产条件,则进行生产,这里简单的更改当前库存量 curnum += neednum; System.out.println("已经生产了" + neednum + "个产品,现仓储量为" + curnum); //唤醒在此对象监视器上等待的所有线程 notifyAll(); } /** * 消费指定数量的产品 * * @param neednum */ public synchronized void consume(int neednum) { //测试是否可消费 while (curnum < neednum) { try { //当前的生产线程等待 wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //满足消费条件,则进行消费,这里简单的更改当前库存量 curnum -= neednum; System.out.println("已经消费了" + neednum + "个产品,现仓储量为" + curnum); //唤醒在此对象监视器上等待的所有线程 notifyAll(); }
} /**
* 生产者
*/
class Producer extends Thread { private int neednum;                //生产产品的数量 private Godown godown;            //仓库 Producer(int neednum, Godown godown) { this.neednum = neednum; this.godown = godown; } public void run() { //生产指定数量的产品 godown.produce(neednum); }
} /**
* 消费者
*/
class Consumer extends Thread { private int neednum;                //生产产品的数量 private Godown godown;            //仓库 Consumer(int neednum, Godown godown) { this.neednum = neednum; this.godown = godown; } public void run() { //消费指定数量的产品 godown.consume(neednum); }
}

二、解释

转载于:https://www.cnblogs.com/james1207/p/3297370.html

Java 多线程-生产者、消费者相关推荐

  1. Java多线程-生产者消费者问题(多个消费者多个生产者)

    Java多线程-生产者消费者问题(多个消费者多个生产者) public class ConsumerProcuderDemo {public static void main(String[] arg ...

  2. java多线程 生产者消费者_java多线程之-生产者与消费者

    java多线程之-并发协作[生产者与消费者]模型 对于多线程程序来说,不管c/c++ java python 等任何编程语言,生产者与消费者模型都是最为经典的.也就是可以说多线程的并发协作 对于此模型 ...

  3. Java多线程生产者消费者调度实现

    生产者消费者模型是多线程中最常见的模型,有着广泛的应用.其主要目的是实现一种动态的平衡,让生产者消费者和谐共处,获得最大化的执行效率. 所说的动态平衡其实就是生产者与消费者协作控制仓储,让消费者不至于 ...

  4. Java多线程——生产者消费者问题

    创建多个线程去执行不同的任务,如果这些任务之间有着某种关系,那么线程之间必须能够通信来协调完成工作. 生产者消费者问题(英语:Producer-consumer problem)就是典型的多线程同步案 ...

  5. java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例

    /**生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二,既然是生产者.消费者,那么生产者类和消费者类就是必须的 * 第三,生产什么,消费什么,所以物品类是必须的,这里 ...

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

    进程定义: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位 线程定义: 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能 ...

  7. Java多线程 生产者-消费者问题示例

    奶箱:相当于缓冲区,容量有限,生产者放入牛奶,消费者拿走牛奶 生产者:实现 Runnable 接口,箱子内有牛奶就取出,没有就等着 消费者:实现 Runnable 接口,箱子还有剩余空间就往里放牛奶, ...

  8. Java多线程-生产者与消费者

    Java多线程生产者与消费者,准确说应该是"生产者-消费者-仓储"模型,使用了仓储,使得生产者消费者模型就显得更有说服力. 对于此模型,应该明确一下几点: 1.生产者仅仅在仓储未满 ...

  9. 【Java】生产者消费者模型

    [Java]生产者消费者模型 0x1 前言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间 ...

  10. 多线程生产者消费者模型

    1. 基础知识: 1. 什么是生产者-消费者模式: 比如有两个进程A和B,它们共享一个固定大小的缓冲区,A进程产生数据放入缓冲区,B进程从缓冲区中取出数据进行计算,那么这里其实就是一个生产者和消费者的 ...

最新文章

  1. rabbitmq怎样确认是否已经消费了消息_【朝夕专刊】RabbitMQ生产者/消费者消息确认...
  2. 转:Oracle SQL 内置函数大全 (一)
  3. 吴恩达 coursera AI 专项五第三课(下)总结+作业答案
  4. (*长期更新)软考网络工程师学习笔记一—RSA算法详解
  5. 对java:comp/env的研究
  6. mediarecorder添加时间戳_Python脚本实现数据处理(官方实例)和Hive自带时间函数...
  7. java.sql.SQLSyntaxErrorException: ORA-00923: 未找到要求的 FROM 关键字
  8. 将图片序列帧合成mp4_超级详细!如何将B站缓存m4s文件无损转换为mp4格式
  9. go kegg_对miRNA进行go和kegg等功能数据库数据库注释
  10. pytorch学习——基本优化思想与最小二乘法
  11. input中radio对象的使用、获取方法
  12. Pycharm如何取消自动换行
  13. HTML页面禁止选择、页面禁止复制、页面禁止右键
  14. python html转图片失真_html dom 转化成图片踩坑记(canvas toDataURL)
  15. python读取word文件内容_[python]读取word文档中的数据,整理成excel表
  16. Padavan老毛子固件玩法入门
  17. 天翼云盘v6.3.5绿色精简版
  18. 苹果手机收不到推送信息_苹果手机微信收不到信息怎么回事(超详细解决方案分享)...
  19. python 画竖线_学习笔记92—python 画横竖分界线
  20. Json 读文件错误:Expecting property name enclosed

热门文章

  1. python的property用法_在python中property怎样使用-百度经验
  2. python后端需要什么基础_【后端开发】python爬虫需要什么基础
  3. php表单验证内容不能为空,php校验表单检测字段是否为空的方法_PHP教程
  4. python推导式多行书写_python三种推导式的详细介绍及其应用示例,强调字典推导的重要性...
  5. sgm3157功能_SGM3157_SGM3157供应商_价格_Datasheet_pdf资料-IC资料网
  6. Spring Boot————AOP入门案例及切面优先级设置
  7. log解析工具 px4_console.log(console.log) = ?
  8. 【CSDN】-京东云部署java项目及性能测试
  9. 2014 java面试题_2014 java面试题 (答案)
  10. python获取文件路径下指定的类型的文件_python学习1-列出指定目录下的指定类型文件...