本文章为小编原创,请尊重文章的原创性,转载请注意写明转载来源:http://blog.csdn.net/u012116457

已知技术參数:

生产者消费者问题,描写叙述一组生产者向一组消费者提供产品/消息。它们共享一个有界缓冲区,生产者向当中放产品/消息,消费者从中取产品/消息。仅仅要缓冲区未满,生产者可放产品/消息,仅仅要缓冲区有数据。消费者可取消息。

即应满足下列二个同步条件:

1.仅仅有在缓冲池中至少有一个缓冲区已存入消息后,消费者才干从中提取消息。否则消费者必须等待。

2.仅仅有缓冲池中至少有一个缓冲区是空时,生产者才干把消息放入缓冲区,否则生产者必须等待。

设计要求:

要求设定一个缓冲池中有n个缓冲区。每一个缓冲区存放一个消息。创建多个生产者,消费者,并在每一个生产者消费者创建时、发出放/取产品申请时、正在放/取产品时和放/取产品结束时分别给出提示信息。并显示取/方产品前后的缓冲区状态。以检查全部处理都遵守对应的操作限制。

上代码:

最核心的代码:

  1. package kcsj;
  2. /**
  3. * 模拟实现生产者--消费者问题
  4. *
  5. * @date 2014/06/24
  6. *
  7. */
  8. public class ProductiveConsumption {
  9. private int front=0; //队头
  10. private int next=0; //队尾
  11. private int bufferLength; //缓冲区大小
  12. private String buffer[]; //缓冲区
  13. private int emptyNum; //空缓冲区数目
  14. public ProductiveConsumption(int bufferLength){
  15. this.bufferLength=bufferLength;
  16. buffer=new String[bufferLength];
  17. emptyNum=bufferLength;
  18. }
  19. //生产
  20. public synchronized void produce(String data){
  21. System.out.println("生产前,空缓冲区数目-----------"+emptyNum);
  22. System.out.println("***生产者正在生产"+data);
  23. while(full()){
  24. System.out.println("*****缓冲池已满,生产等待");
  25. try {
  26. this.wait();
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. this.notify();
  32. buffer[next]=data;
  33. next=(next+1)%bufferLength;
  34. System.out.println("****生产者成功生产:"+data);
  35. emptyNum--;
  36. System.out.println("生产后,空缓冲区数目-----------"+emptyNum);
  37. }
  38. //消费
  39. public synchronized void consum(){
  40. System.out.println("消费前,空缓冲区数目-----------"+emptyNum);
  41. while(empty()){
  42. System.out.println("*****缓冲池为空,消费等待");
  43. try {
  44. this.wait();
  45. } catch (InterruptedException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. System.out.println("***消费者正在消费"+buffer[front]);
  50. this.notify();
  51. System.out.println("****消费者成功消费:"+buffer[front]);
  52. front=(front+1)%bufferLength;
  53. emptyNum++;
  54. System.out.println("消费后,空缓冲区数目-----------"+emptyNum);
  55. }
  56. //缓冲池是否已满
  57. public boolean full(){
  58. if(emptyNum==0){
  59. return true;
  60. }
  61. return false;
  62. }
  63. //缓冲池是否为空
  64. public boolean empty(){
  65. if(bufferLength==emptyNum){
  66. return true;
  67. }
  68. return false;
  69. }
  70.  
  71. }

其它辅助代码:

  1. package kcsj;
  2. /**
  3. *创建生产者
  4. */
  5. public class CreateProducer implements Runnable{
  6. ProductiveConsumption pc;
  7. int producerNum;
  8. public CreateProducer(ProductiveConsumption pc,int producerNum){
  9. this.pc=pc;
  10. this.producerNum=producerNum;
  11. }
  12. public void run(){
  13. for(int i=0;i<producerNum;i++){
  14. Producer producer=new Producer(pc);
  15. try {
  16. Thread.sleep((int)(Math.random()*100));
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }
  22. }
  1. package kcsj;
  2. /**
  3. *创建消费者
  4. */
  5. public class CreateConsumer implements Runnable{
  6. ProductiveConsumption pc;
  7. int consumerNum;
  8. public CreateConsumer(ProductiveConsumption pc,int consumerNum){
  9. this.pc=pc;
  10. this.consumerNum=consumerNum;
  11. }
  12. public void run(){
  13. for(int i=0;i<consumerNum;i++){
  14. Consumer consumer=new Consumer(pc);
  15. try {
  16. Thread.sleep((int)(Math.random()*100));
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }
  22. }
  1. package kcsj;
  2.  
  3. public class Producer{
  4. ProductiveConsumption pc;
  5. public Producer(ProductiveConsumption pc){
  6. this.pc=pc;
  7. System.out.println("*成功创建一个生产者");
  8. apply();
  9. }
  10. public void apply(){
  11. char c=(char)(Math.random()*26+'A');
  12. String data=String.valueOf(c);
  13. System.out.println("**生产者发出请求");
  14. pc.produce(data);
  15. }
  16.  
  17. }
  1. package kcsj;
  2.  
  3. public class Consumer{
  4. ProductiveConsumption pc;
  5. public Consumer(ProductiveConsumption pc){
  6. this.pc=pc;
  7. System.out.println("*成功创建一个消费者");
  8. apply();
  9. }
  10. public void apply() {
  11. System.out.println("**消费者发出请求");
  12. pc.consum();
  13. }
  14. }
  1. package kcsj;
  2.  
  3. import java.util.Scanner;
  4.  
  5. public class Test {
  6.  
  7. public static void main(String[] args) {
  8. Scanner sc=new Scanner(System.in);
  9. System.out.println("输入缓冲区大小");
  10. int buffLength=sc.nextInt();
  11. System.out.println("输入生产者和消费者个数");
  12. int prodecerNum=sc.nextInt();
  13. int consumerNum=sc.nextInt();
  14.  
  15. ProductiveConsumption pc=new ProductiveConsumption(buffLength);
  16. Runnable cp=new CreateProducer(pc,prodecerNum);
  17. Runnable cc=new CreateConsumer(pc,consumerNum);
  18. Thread t1=new Thread(cp);
  19. Thread t2=new Thread(cc);
  20. t1.start();
  21. t2.start();
  22. }
  23. }

java模拟实现生产者---消费者问题的更多相关文章

  1. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  2. java多线程解决生产者消费者问题

    import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...

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

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

  4. Java设计模式之生产者消费者模式

    Java设计模式之生产者消费者模式 博客分类: 设计模式 设计模式Java多线程编程thread 转载 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一 ...

  5. JAVA多线程之生产者 消费者模式 妈妈做面包案例

    创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包  最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...

  6. 用Java写一个生产者-消费者队列

    生产者消费者的模型作用 通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用. 解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系 ...

  7. Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)

    生产者-消费者模型是多线程问题里面的经典问题,也是面试的常见问题.有如下几个常见的实现方法: 1. wait()/notify() 2. lock & condition 3. Blockin ...

  8. Java并发之:生产者消费者问题

    生产者消费者问题是Java并发中的常见问题之一,在实现时,一般可以考虑使用juc包下的BlockingQueue接口,至于具体使用哪个类,则就需要根据具体的使用场景具体分析了.本文主要实现一个生产者消 ...

  9. Java多线程同步——生产者消费者问题

    这是马士兵老师的Java视频教程里的一个生产者消费者问题的模型 public class ProduceConsumer{ public static void main(String[] args) ...

随机推荐

  1. vs2010 条件断点 has changed是什么意思?

    在vs2010 断点设置 condition里,有2个选项可以选择: 一个是true,另个是has changed,true好理解,如果表达式为真则停止.但是has changed是什么意思.看了官网 ...

  2. Trie树:应用于统计和排序

    Trie树:应用于统计和排序 1. 什么是trie树 1.Trie树 (特例结构树)       Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构 ...

  3. uva-11995 - I Can Guess the Data Structure!(栈,优先队列,队列,水题)

    11995 - I Can Guess the Data Structure! There is a bag-like data structure, supporting two operation ...

  4. Winsock编程基础介绍 .

    相信很多人都对网络编程感兴趣,下面我们就来介绍,在网络编程中应用最广泛的编程接口Winsock API. 使用Winsock API的编程,应该了解一些TCP/IP的基础知识.虽然你可以直接使用Win ...

  5. switch语句:适用于一个条件有多个分支的情况---分支语句

    例1: 客服选择功能,然后按按键 Console.WriteLine("查花费请按1,查余额请按2,查流量请按3,办理业务请按4,宽带请按5,人工服务请按6,集团业务请按7"); ...

  6. 非root不能gdb attach的限制

    Could not attach to process.  If your uid matches the uid of the targetprocess, check the setting of ...

  7. BZOJ 2435: [Noi2011]道路修建( dfs )

    NOI的水题...直接一遍DFS即可 ------------------------------------------------------------------------- #includ ...

  8. Java面试题集(1-50)

    下面的内容是对网上原有的面试题集及答案进行了全面修订之后的内容(原来的题目有很多重复无用的题以及错误的答案),参照了JDK最新版本,删除了重复题目以及EJB2.x等无用内容,补充最新面试题.知识点巩固 ...

  9. PHP学习笔记1-常量,函数

    常量:使用const(php5)声明,只能被赋值一次,php5以下版本使用define: <?php const THE_VALUE = 100;//PHP5中才有const echo THE_ ...

  10. QGraphicsView中选中QGraphicsPathItem使之不出现虚线框

    绘制一条贝赛尔曲线,当选中该曲线时,显示其控制点并把控制点和起始点连结起来,从而可以清晰的显示曲线的参数. # -*- coding: utf-8 -*-from PyQt4 import QtGui ...