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

这是马士兵老师的Java视频教程里的一个生产者消费者问题的模型

 

[java]  view plain copy
 
  1. public class ProduceConsumer{  
  2.     public static void main(String[] args){  
  3.         SyncStack ss = new SyncStack();  
  4.         Producer pro = new Producer(ss);  
  5.         Consumer con = new Consumer(ss);  
  6.         new Thread(pro).start();  
  7.         new Thread(con).start();  
  8.           
  9.     }     
  10. }  
  11.   
  12. class Product{  
  13.     int id;  
  14.     public Product(int id){  
  15.         this.id = id;  
  16.     }     
  17.     public String toString(){  
  18.         return "Product:" + id;  
  19.     }  
  20. }  
  21.   
  22. class SyncStack{  
  23.     int index  = 0;  
  24.     Product[] arrPro = new Product[6];  
  25.       
  26.     public synchronized void push(Product p){  
  27.         while (index == arrPro.length){  
  28.             try {  
  29.                 this.wait();  
  30.             } catch (InterruptedException e) {  
  31.                 // TODO Auto-generated catch block  
  32.                 e.printStackTrace();  
  33.             }  
  34.         }  
  35.           
  36.         this.notify();        
  37.         arrPro[index] = p;  
  38.         index++;  
  39.     }  
  40.       
  41.     public synchronized Product pop(){  
  42.         while (index == 0){  
  43.             try {  
  44.                 this.wait();  
  45.             } catch (InterruptedException e) {  
  46.                 // TODO Auto-generated catch block  
  47.                 e.printStackTrace();  
  48.             }  
  49.         }  
  50.           
  51.         this.notify();    
  52.         index--;  
  53.         return arrPro[index];  
  54.     }  
  55.       
  56. }  
  57.   
  58. class Producer implements Runnable{  
  59.     SyncStack ss = null;  
  60.     public Producer(SyncStack ss){ //持有SyncStack的一个引用  
  61.         this.ss = ss;  
  62.     }  
  63.     @Override  
  64.     public void run() {  
  65.         for(int i=0; i<20; i++){  
  66.             Product p = new Product(i);  
  67.             ss.push(p);  
  68. System.out.println("生产了:" + p);  
  69.             try {  
  70.                 Thread.sleep(100);  
  71.             } catch (InterruptedException e) {  
  72.                 e.printStackTrace();  
  73.             }  
  74.           
  75.         }  
  76.           
  77.     }     
  78. }  
  79.   
  80. class Consumer implements Runnable{  
  81.   
  82.     SyncStack ss = null;  
  83.     public Consumer(SyncStack ss){ //持有SyncStack的一个引用  
  84.         this.ss = ss;  
  85.     }  
  86.     @Override  
  87.     public void run() {  
  88.         for(int i=0; i<20; i++){  
  89.             Product p = ss.pop();  
  90. System.out.println("消费了:" + p);  
  91.             try {  
  92.                 Thread.sleep(1000);  
  93.             } catch (InterruptedException e) {  
  94.                 e.printStackTrace();  
  95.             }  
  96.           
  97.         }  
  98.           
  99.     }     
  100. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、设计要求 设计一个模拟仿真“生产者-消费者”问题的解决过程及方法的程序。 主要内容是P、V操作过程的设计与实现。生产消费者问题是操作系统设计中经常遇到的问题。多个生产者和消费者线程访问在共享内存中的环形缓冲。生产者生产产品并将它放入环形缓冲,同时消费者从缓冲中取出产品并消费。当缓冲区满时生产者阻塞并且当缓冲区有空时生产者又重新工作。类似的,消费者当缓冲区空时阻塞并且当缓冲区有产品时又重新工作。显然,生产者和消费者需要一种同步机制以协调它们的工作。 二、系统功能 本程序模拟实现了“生产者-消费者”问题的解决过程,用图形界面动态演示了P、V操作过程以及生产者、消费者进程之间的工作流程。 本程序使用的算法是典型的P、V操作使用信号量解决“生产者-消费者”问题。 本程序在界面上使用了Java的swing接口函数,用矩形条表示生产者进程中待生产的产品,并设置了三个分区分别表示生产者进程待生产的产品、公共缓冲池中已生产的产品和消费者进程已消费的产品,以动画的效果动态演示了待生产产品变成消费者进程中已消费产品的过程,以及在这一过程中生产者进程和消费者进程协调工作的过程。在程序运行过程中使用了两个生产者线程和两个消费者线程并发工作,并使用了线程随机休眠的策略,即每个线程在完成一次生产过程或消费过程后随机休眠1至10秒钟。这一策略能保证生产者和消费者之间的运行顺序被打破,从而产生生产产品和消费产品之间的矛盾(即没有产品可消费的情况下消费者试图向公共缓冲池取产品消费、公共缓冲池里的产品已满的情况下生产者试图生产产品放入缓冲池)。因为生产者生产产品和消费者消费产品都是随机的,所以产生的矛盾也是不可预知的,在这种情况下,才能检验所使用的算法是否健壮高效。而本程序正是基于这种思想设计出来的,用来模拟生产者消费者问题的解决过程。 本程序在运行时提供友好的交互界面,且操作简单,在模拟过程中各种情况有相应文字提示,并伴有相应的图像变化,如:当没有产品可消费的情况下消费者试图向公共缓冲池取产品消费,消费者进程阻塞,公共缓冲池随之变成红色,文字提示框内显示warning: it's empty!Consumer is block;当缓冲池已满而生产者试图生产产品并向缓冲池放入产品时,生产者进程阻塞,公共缓冲池里的每一个产品变成黄色,问题提示框显示warning: it's full!Producer is block。整个模拟过程通俗易懂,利于理解,能很好的帮助使用者加强生产者消费者问题的理解。
一、 课程设计目的 在多道程序环境下,进程同步问题十分重要,通过解决“生产者-消费者”问题,可以帮助我们更好的理解进程同步的概念及实现方法。掌握线程创建和终止的方法,加深对线程和进程概念的理解,会用同步与互斥方法实现线程之间的进行操作。 在学习操作系统课程的基础上,通过实践加深对进程同步的认识,同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。 二、 课程设计内容 模拟仿真“生产者-消费者”问题的解决过程及方法。 三、 系统分析与设计 1、 系统分析 在OS中引入进程后,虽然提高了资源的利用率和系统的吞吐量,但由于进程的异步性,也会给系统造成混乱,尤其是在他们争用临界资源时。为了对多个相关进程在执行次序上进行协调,以使并发执行的诸程序之间能有效地共享资源和相互合作,使程序的执行具有可再现性,所以引入了进程同步的概念。信号量机制是一种卓有成效的进程同步工具。 在生产者---消费者问题中应注意(信号量名称以多个生产者和多个消费者中的为例):首先,在每个程序中用于互斥的wait(mutex)和signal(mutex)必须成对出现;其次,对资源信号量empty和full的wait和signal操作,同样需要成对地出现,但它们分别处于不同的程序中。生产者与消费者进程共享一个大小固定的缓冲区。其中,一个或多个生产者生产数据,并将生产的数据存入缓冲区,并有一个或多个消费者从缓冲区中取数据。 2、 系统设计: 系统的设计必须要体现进程之间的同步关系,所以本系统采用2个生产者、2个消费者 和20个缓冲区的框架体系设计。为了更能体现该系统进程之间的同步关系,系统的生产者、 消费者的速度应该可控,以更好更明显的表现出结果。 为了使本系统以更加简单、直观的形式把“消费者-生产者”问题表现出来,我选择了使 用可视化界面编程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值