1. /*@author shijin
  2. * 生产者与消费者模型中,要保证以下几点:
  3. * 1 同一时间内只能有一个生产者生产     生产方法加锁sychronized
  4. * 2 同一时间内只能有一个消费者消费     消费方法加锁sychronized
  5. * 3 生产者生产的同时消费者不能消费     生产方法加锁sychronized
  6. * 4 消费者消费的同时生产者不能生产     消费方法加锁sychronized
  7. * 5 共享空间空时消费者不能继续消费     消费前循环判断是否为空,空的话将该线程wait,释放锁允许其他同步方法执行
  8. * 6 共享空间满时生产者不能继续生产     生产前循环判断是否为满,满的话将该线程wait,释放锁允许其他同步方法执行
  9. */
  10. //主类
  11. class  ProducerConsumer
  12. {
  13. public static void main(String[] args)
  14. {
  15. StackBasket s = new StackBasket();
  16. Producer p = new Producer(s);
  17. Consumer c = new Consumer(s);
  18. Thread tp = new Thread(p);
  19. Thread tc = new Thread(c);
  20. tp.start();
  21. tc.start();
  22. }
  23. }
  24. //
  25. class Mantou
  26. {
  27. private int id;
  28. Mantou(int id){
  29. this.id = id;
  30. }
  31. public String toString(){
  32. return "Mantou :" + id;
  33. }
  34. }
  35. //共享栈空间
  36. class StackBasket
  37. {
  38. Mantou sm[] = new Mantou[6];
  39. int index = 0;
  40. /**
  41. * show 生产方法.
  42. * show 该方法为同步方法,持有方法锁;
  43. * show 首先循环判断满否,满的话使该线程等待,释放同步方法锁,允许消费;
  44. * show 当不满时首先唤醒正在等待的消费方法,但是也只能让其进入就绪状态,
  45. * show 等生产结束释放同步方法锁后消费才能持有该锁进行消费
  46. * @param m 元素
  47. * @return 没有返回值
  48. */
  49. public synchronized void push(Mantou m){
  50. try{
  51. while(index == sm.length){
  52. System.out.println("!!!!!!!!!生产满了!!!!!!!!!");
  53. this.wait();
  54. }
  55. this.notify();
  56. }catch(InterruptedException e){
  57. e.printStackTrace();
  58. }catch(IllegalMonitorStateException e){
  59. e.printStackTrace();
  60. }
  61. sm[index] = m;
  62. index++;
  63. System.out.println("生产了:" + m + " 共" + index + "个馒头");
  64. }
  65. /**
  66. * show 消费方法
  67. * show 该方法为同步方法,持有方法锁
  68. * show 首先循环判断空否,空的话使该线程等待,释放同步方法锁,允许生产;
  69. * show 当不空时首先唤醒正在等待的生产方法,但是也只能让其进入就绪状态
  70. * show 等消费结束释放同步方法锁后生产才能持有该锁进行生产
  71. * @param b true 表示显示,false 表示隐藏
  72. * @return 没有返回值
  73. */
  74. public synchronized Mantou pop(){
  75. try{
  76. while(index == 0){
  77. System.out.println("!!!!!!!!!消费光了!!!!!!!!!");
  78. this.wait();
  79. }
  80. this.notify();
  81. }catch(InterruptedException e){
  82. e.printStackTrace();
  83. }catch(IllegalMonitorStateException e){
  84. e.printStackTrace();
  85. }
  86. index--;
  87. System.out.println("消费了:---------" + sm[index] + " 共" + index + "个馒头");
  88. return sm[index];
  89. }
  90. }
  91. class Producer implements Runnable
  92. {
  93. StackBasket ss = new StackBasket();
  94. Producer(StackBasket ss){
  95. this.ss = ss;
  96. }
  97. /**
  98. * show 生产进程.
  99. */
  100. public void run(){
  101. for(int i = 0;i < 20;i++){
  102. Mantou m = new Mantou(i);
  103. ss.push(m);
  104. //          System.out.println("生产了:" + m + " 共" + ss.index + "个馒头");
  105. //          在上面一行进行测试是不妥的,对index的访问应该在原子操作里,因为可能在push之后此输出之前又消费了,会产生输出混乱
  106. try{
  107. Thread.sleep((int)(Math.random()*500));
  108. }catch(InterruptedException e){
  109. e.printStackTrace();
  110. }
  111. }
  112. }
  113. }
  114. class Consumer implements Runnable
  115. {
  116. StackBasket ss = new StackBasket();
  117. Consumer(StackBasket ss){
  118. this.ss = ss;
  119. }
  120. /**
  121. * show 消费进程.
  122. */
  123. public void run(){
  124. for(int i = 0;i < 20;i++){
  125. Mantou m = ss.pop();
  126. //          System.out.println("消费了:---------" + m + " 共" + ss.index + "个馒头");
  127. //  同上  在上面一行进行测试也是不妥的,对index的访问应该在原子操作里,因为可能在pop之后此输出之前又生产了,会产生输出混乱
  128. try{
  129. Thread.sleep((int)(Math.random()*1000));
  130. }catch(InterruptedException e){
  131. e.printStackTrace();
  132. }
  133. }
  134. }
  135. }

转载于:https://www.cnblogs.com/kaikailele/p/4009262.html

java多线程之消费者生产者模式相关推荐

  1. 多线程之消费者生产者模式加入阻塞队列

    队列相关资料: http://chenjumin.iteye.com/blog/2182322 http://blog.csdn.net/luohuacanyue/article/details/16 ...

  2. Java多线程编程中Future模式的详解

    转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...

  3. Java多线程(含生产者消费者模式详解)

    多线程 导航 多线程 1 线程.进程.多线程概述 2 创建线程 (重点) 2.1 继承Thread类(Thread类也实现了Runnable接口) 2.2 实现Runnable接口(无消息返回) 2. ...

  4. java多线程队列_java多线程消费者生产者模式(BlockingQueue 通过阻塞队列实现)

    import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; /** * Cr ...

  5. Java多线程:解决生产者/消费者模式

    什么是生产者/消费者模式 生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品. 具体来说就是: 生产者 ...

  6. java 多线程经典例子——生产者与消费者的问题

    产品名称类: public class Product {//产品名称private String name;public String getName() {return name;}public ...

  7. java实现基于管程法的消费者生产者模式(两个消费者一个生产者)

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...

  8. 基于java多线程来实现生产者和消费者的实例

    声明:本实例是在网上看到,做了很小的修改.所以感谢之前的作者.只是一时忘了哪儿看到,没法加入链接,向原作者道歉,以示尊重.抱歉-^)... 同步栈: 1 class SycnStack { 2 pri ...

  9. Java多线程2.3.生产者与消费者之间的关系2

    生产者与消费者之间的关系 1.线程间通信问题描述图 2.线程的状态转换图及常见执行情况 3.等待唤醒机制思路图解 4.线程的生命周期

最新文章

  1. 状态和面向对象编程——1.定位步骤
  2. 计算机后门做法正确的是,网络信息安全知识:张同学发现安全软件提醒自己的电脑有系统漏洞,如果你是张同学,最恰当的做法是?()...
  3. 穷举n位二进制数 (深搜、回溯_子集树)
  4. 解决linux ssh客户端SSH连接linux服务器很慢的问题
  5. matplotlib 一张图多个图,如何在Matplotlib中绘制同一个图上的多个函数?
  6. 第六届蓝桥杯JavaC组_垒骰子_详解
  7. django 函数装饰器 变为 类装饰器
  8. 使用绝对布局的方法创建一个登录密码验证的简易窗口
  9. python爬取ajax动态内容肯德基门店,Python爬虫如何爬取KFC地址
  10. 结果显示窗口如何缩小_Proe草绘时提示“截面再生失败。不合适的尺寸”如何处理?...
  11. 64位linux安装mysql数据库吗_Linux下安装Mysql数据库
  12. 计算机科学NIP,焦点:网络入侵防护(NIP)技术真的成了鸡肋吗? -电脑资料
  13. unity3d双面材质_[转]unity3d中创建双面材质
  14. macOS 10.15安装GDB
  15. HTML知识积累及实践(六) - pre,混合框架
  16. 网站三级域名是什么样?
  17. hdu 5064——Find Sequence
  18. 更新提示!Chrome新的零日漏洞正被利用
  19. 判断一个数为奇偶数的三种方法
  20. 巴比特《8问》专访 Conflux 创始人龙凡教授

热门文章

  1. 个人脚本收藏[不断更新 last update 2005-12-10]
  2. decide how to invest 15 million pound in the development cost?
  3. approach for attending ieee conferences
  4. 助力航天元器件管理“高可靠降成本”,赛思库获数千万元Pre-A轮融资
  5. ffmpeg命令详解(转)
  6. Xcode代码块的创建、使用和删除
  7. redis 基础操作学习
  8. JavaScript中的this妙用
  9. 低水平博士是提升科研生涯的毒药
  10. tcp/udp高并发和高吐吞性能测试工具