一、整体代码

ThreadDemo.java

  1. public class ThreadDemo {
  2. public static void main(String[] args) {
  3. Godown godown = new Godown(0);
  4. Consumer c1 = new Consumer(50, godown);
  5. Consumer c2 = new Consumer(20, godown);
  6. Consumer c3 = new Consumer(30, godown);
  7. Producer p1 = new Producer(10, godown);
  8. Producer p2 = new Producer(10, godown);
  9. Producer p3 = new Producer(10, godown);
  10. Producer p4 = new Producer(10, godown);
  11. Producer p5 = new Producer(10, godown);
  12. Producer p6 = new Producer(10, godown);
  13. Producer p7 = new Producer(80, godown);
  14.  
  15. c1.start();
  16. c2.start();
  17. c3.start();
  18. p1.start();
  19. p2.start();
  20. p3.start();
  21. p4.start();
  22. p5.start();
  23. p6.start();
  24. p7.start();
  25. }
  26. }
  27.  
  28. /**
  29. * 仓库
  30. */
  31. class Godown {
  32. public static final int max_size = 100; //最大库存量
  33. public int curnum; //当前库存量
  34.  
  35. Godown() {
  36. }
  37.  
  38. Godown(int curnum) {
  39. this.curnum = curnum;
  40. }
  41.  
  42. /**
  43. * 生产指定数量的产品
  44. *
  45. * @param neednum
  46. */
  47. public synchronized void produce(int neednum) {
  48. //测试是否需要生产
  49. while (neednum + curnum > max_size) {
  50. System.out.println("要生产的产品数量" + neednum + "超过剩余库存量" + (max_size - curnum) + ",暂时不能执行生产任务!");
  51. try {
  52. //当前的生产线程等待
  53. wait();
  54. } catch (InterruptedException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. //满足生产条件,则进行生产,这里简单的更改当前库存量
  59. curnum += neednum;
  60. System.out.println("已经生产了" + neednum + "个产品,现仓储量为" + curnum);
  61. //唤醒在此对象监视器上等待的所有线程
  62. notifyAll();
  63. }
  64.  
  65. /**
  66. * 消费指定数量的产品
  67. *
  68. * @param neednum
  69. */
  70. public synchronized void consume(int neednum) {
  71. //测试是否可消费
  72. while (curnum < neednum) {
  73. try {
  74. //当前的生产线程等待
  75. wait();
  76. } catch (InterruptedException e) {
  77. e.printStackTrace();
  78. }
  79. }
  80. //满足消费条件,则进行消费,这里简单的更改当前库存量
  81. curnum -= neednum;
  82. System.out.println("已经消费了" + neednum + "个产品,现仓储量为" + curnum);
  83. //唤醒在此对象监视器上等待的所有线程
  84. notifyAll();
  85. }
  86. }
  87.  
  88. /**
  89. * 生产者
  90. */
  91. class Producer extends Thread {
  92. private int neednum; //生产产品的数量
  93. private Godown godown; //仓库
  94.  
  95. Producer(int neednum, Godown godown) {
  96. this.neednum = neednum;
  97. this.godown = godown;
  98. }
  99.  
  100. public void run() {
  101. //生产指定数量的产品
  102. godown.produce(neednum);
  103. }
  104. }
  105.  
  106. /**
  107. * 消费者
  108. */
  109. class Consumer extends Thread {
  110. private int neednum; //生产产品的数量
  111. private Godown godown; //仓库
  112.  
  113. Consumer(int neednum, Godown godown) {
  114. this.neednum = neednum;
  115. this.godown = godown;
  116. }
  117.  
  118. public void run() {
  119. //消费指定数量的产品
  120. godown.consume(neednum);
  121. }
  122. }

二、解释

Java 多线程-生产者、消费者的更多相关文章

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

    package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...

  2. java多线程 生产者消费者案例-虚假唤醒

    package com.java.juc; public class TestProductAndConsumer { public static void main(String[] args) { ...

  3. java多线程生产者消费者

    //Java Thread producer customer class ThreadTest { public static void main(String[] args) { Q q=new ...

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

    https://www.cnblogs.com/hckblogs/p/7858545.html

  5. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

  6. Java实现生产者消费者问题与读者写者问题

    摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...

  7. Java实现多线程生产者消费者模式的两种方法

    生产者消费者模式:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据.生产者生产一个,消费者消费一个,不断循环. 第一种实现方法,用BlockingQueue阻塞队 ...

  8. Java实现多线程生产者消费者模型及优化方案

    生产者-消费者模型是进程间通信的重要内容之一.其原理十分简单,但自己用语言实现往往会出现很多的问题,下面我们用一系列代码来展现在编码中容易出现的问题以及最优解决方案. /* 单生产者.单消费者生产烤鸭 ...

  9. java实现多线程生产者消费者模式

    1.概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消 ...

  10. Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...

随机推荐

  1. Javascript debugger come accross error

    Problem: “Unable to attach to the process. Another debugger might be attached to the process.” Solut ...

  2. 【转】Ubuntu下deb包的安装方法

    [转]Ubuntu下deb包的安装方法 deb是debian linus的安装格式,跟red hat的rpm非常相似,最基本的安装命令是:dpkg -i file.deb dpkg 是Debian P ...

  3. 初始Android-配置环境

    最近闲来无事自学了一下Android,今天没事想整理一下思绪,简单的介绍一下我自己对环境配置的认识,仅供参考,欢迎提出意见. 1.首先打开Eclipse,然后安装ADT,准备好ADTjar包或者zip ...

  4. Week 5a - Mouse input and more lists----learning notes

    pyton 程序内容的颠倒,运用 [](列表) def reverse_string(s): """Returns the reversal of the given s ...

  5. Week15(12月16日):授课综述1

    Part I:提问 =========================== 1.(   )类提供了一个对Entity Framework的抽象,能够进行数据持久化并接受数据. A.Layout    ...

  6. Ubuntu12.04 cuda5.5安装

    预处理步骤: 首先确认你的电脑装了一个可以运行CUDA程序的GPU. lspci | grep -i nvidia 另外要确认linux版本和gcc版本 具体参考链接:http://docs.nvid ...

  7. MFC基础类源码CPP实现文件

    WinMain.CPP---->AfxWinMain()  //近似可认为是WinMain()函数的入口 VIEWCORE.CPP---->CView DOCCORE.CPP----> ...

  8. 2-06. 数列求和(20)(ZJUPAT 数学)

    题目链接:http://pat.zju.edu.cn/contests/ds/2-06 给定某数字A(1<=A<=9)以及非负整数N(0<=N<=100000).求数列之和S ...

  9. 【jQuery】使用JQ来编写面板的淡入淡出效果

    本文与上一篇的<[jQuery]使用JQ来编写最主要的淡入淡出效果>(点击打开链接)为姊妹篇. 但上一篇仅仅是对文本的基本控制,本篇则是对面板元素进行控制. 尽管功能上很类似,可是所用到的 ...

  10. 循环调用修正sic86

    create or replace procedure rebuild_sic86_wyl(pi_aac001 in number, po_fhz out varchar2, po_msg out v ...