java多线程之消费者生产者模式

  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. }
时间: 2024-12-20 05:31:52

java多线程之消费者生产者模式的相关文章

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

队列相关资料: http://chenjumin.iteye.com/blog/2182322 http://blog.csdn.net/luohuacanyue/article/details/16359777 Queue ------------ 1.ArrayDeque, (数组双端队列) 2.PriorityQueue, (优先级队列) 3.ConcurrentLinkedQueue, (基于链表的并发队列) 4.DelayQueue, (延期阻塞队列)(阻塞队列实现了BlockingQ

JAVA多线程关于消费者/生产者的设计模式

1 import javax.swing.plaf.SliderUI; 2 3 /* 4 * 生产者Producter 5 * 仓库Godown 6 * 消费者 Consumer 7 * 生产者和消费者通过仓库而建立起联系,仓库的当前数量低于最大库存量时,生产者线程不断生产产品(修改Godown类的属性的值) 8 * 仓库的产品数量大于0时,消费者不断取出产品(修改Godown类的属性的值).当生产者生产的产品等于最大库存值时, 9 * 停止生产,当产品数量小于0时,消费者停止消费 10 * 1

Java多线程编程中Future模式的详解&lt;转&gt;

Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Future模式,关于其他多线程设计模式的地址如下:关于其他多线程设计模式的地址如下:关于Master-Worker模式的详解: Java多线程编程中Master-Worker模式的详解关于Guarded Suspeionsion模式的详解: Java多线程编程中Guarded Suspeionsion模式

java多线程 生产消费者模型

[seriesposts sid=500] 下面的代码讲述了一个故事 一个面包生产铺里目前有30个面包,有三个人来买面包,第一个人要买50个,第二个要买20个,第三个要买30个. 第一个人不够,所以等着,让第二个买了.面包铺继续生产面包.有7个人在生产. package com.javaer.thread; public class CPMode { public static void main(String[] args) { Godown godown = new Godown(30);

java多线程同步以及线程间通信详解&amp;消费者生产者模式&amp;死锁&amp;Thread.join()(多线程编程之二)

本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: [java] view plain copy print? package com.zejian.test; /** * @author zejian * @time 2016年3月12日 下午2:55:42 * @decrition 模拟卖票线程 */ public class Ticket implements Runnable { //当前拥有的票数 private 

java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现

java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了  wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样,先定义一个缓冲区: public class ValueObject { public static String value = ""; } 换种写法,生产和消费方法放在一个类里面: public class ThreadDomain41 extends ReentrantLock {

Java多线程设计模式(2)生产者与消费者模式

1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不匹配. 当要从某个线程Produccer参与者将数据传输给其它线程Consumer参与者的时候,此时就可以在中间加一个Channel参与者,在Channel参与者中以某种方式存放接受的数据,再以某方式来获取收到的数据,Channel就可以来缓存两个线程之间传输的数据,在Channel参与者为了保证安

java多线程中的生产者与消费者之等待唤醒机制@Version1.0

一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒:    Object类中提供了三个方法:    wait():等待    notify():唤醒单个线程    notifyAll():唤醒所有线程2.为什么这些方法不定义在Thread类中呢?  这些方法的调用必须通过锁对象调用,而我们刚才使用的锁对象是任意锁对象.  所以,这些方法必须定义在Object类中.3.当我们在使用多线程的时候有的时候需要,一条线程产生一个数据,另一条线程接着消费一个数据,一边生产一边消费,

java消费者生产者模式及JDK之阻塞队列LinkedBlockingQueue实现

生产者消费者问题 (英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了两个共享固定大小缓冲区的线程--即所谓的"生产者"和"消费者"--在实际运行时会发生的问题.生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗这些数据.该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空