生产者与消费者的问题(Java版)

说明:该程序是本人在看:Java程序设计标准教程 一书上的程序案例,由于此前上操作系统课程要求写生产者与消费者的实验(以前不会写),所以一看见这个案例立马就敲了一遍源代码,放在这共享,留着理解多线程这部分的知识用。

package com.thread;
/**
 * @生产者与消费者的问题
 */
public class ProductTest {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Repertory repertory=new Repertory(); //仓库
  new Thread(new Producer(repertory)).start(); //生产者线程
  new Thread(new Consumer(repertory)).start(); //消费者线程
 }

}

//仓库
class Repertory{
 //默认0个产品
 private int product = 0;
 //生产者生产出来的产品放置到仓库中
 public synchronized void addProduct(){
  if(this.product >= 5){
   try {
    System.out.println("---产品已满,请稍后再生产---");
    this.wait();//产品已满,请稍后再生产
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }  
  }else{
   product++;
   System.out.println("生产者生产第"+product+"个产品");
   System.out.println("---通知等待区的消费者可以取产品了---");
   this.notifyAll(); //通知等待区的消费者可以取产品了
  }
 }
 //消费者从仓库中取产品
 public synchronized void getProduct(){
  if(this.product <= 0){
   try {
    System.out.println("---缺货,请稍候再取---");
    this.wait();//缺货,请稍候再取
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }else{
   System.out.println("消费者取走了第"+product+"个产品");
   product--;
   System.out.println("---通知等待区的生产者可以生产产品了---");
   this.notifyAll(); //通知等待区的生产者可以生产产品了
  }
 }
}

//生产者线程要执行的任务
class Producer implements Runnable{
 private Repertory repertory;
 public Producer(Repertory repertory){
  this.repertory=repertory;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  System.out.println("生产者开始生产产品");
  while(true){
   try {
    Thread.sleep((int)(Math.random()*10)*100);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   repertory.addProduct(); //生产产品
  }
 }
 
}
//消费者线程要执行的任务
class Consumer implements Runnable{
 private Repertory repertory;
 public Consumer(Repertory repertory){
  this.repertory=repertory;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  System.out.println("消费者开始取走产品");
  while(true){
   try {
    Thread.sleep((int)(Math.random()*10)*100);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   repertory.getProduct();
  }
 }

}

 

------------------程序结果(程序是死循环,所以下面是程序运行一段时间后终止程序获取的结果)------------------------------

 

生产者开始生产产品
消费者开始取走产品
---缺货,请稍候再取---
生产者生产第1个产品
---通知等待区的消费者可以取产品了---
生产者生产第2个产品
---通知等待区的消费者可以取产品了---
生产者生产第3个产品
---通知等待区的消费者可以取产品了---
消费者取走了第3个产品
---通知等待区的生产者可以生产产品了---
消费者取走了第2个产品
---通知等待区的生产者可以生产产品了---
生产者生产第2个产品
---通知等待区的消费者可以取产品了---
消费者取走了第2个产品
---通知等待区的生产者可以生产产品了---
消费者取走了第1个产品
---通知等待区的生产者可以生产产品了---
生产者生产第1个产品
---通知等待区的消费者可以取产品了---
消费者取走了第1个产品
---通知等待区的生产者可以生产产品了---
生产者生产第1个产品
---通知等待区的消费者可以取产品了---
生产者生产第2个产品
---通知等待区的消费者可以取产品了---
生产者生产第3个产品
---通知等待区的消费者可以取产品了---
生产者生产第4个产品
---通知等待区的消费者可以取产品了---
生产者生产第5个产品
---通知等待区的消费者可以取产品了---
---产品已满,请稍后再生产---
消费者取走了第5个产品
---通知等待区的生产者可以生产产品了---
生产者生产第5个产品
---通知等待区的消费者可以取产品了---
消费者取走了第5个产品
---通知等待区的生产者可以生产产品了---
生产者生产第5个产品
---通知等待区的消费者可以取产品了---
消费者取走了第5个产品
---通知等待区的生产者可以生产产品了---
消费者取走了第4个产品
---通知等待区的生产者可以生产产品了---
生产者生产第4个产品
---通知等待区的消费者可以取产品了---
消费者取走了第4个产品
---通知等待区的生产者可以生产产品了---
生产者生产第4个产品
---通知等待区的消费者可以取产品了---
消费者取走了第4个产品
---通知等待区的生产者可以生产产品了---
生产者生产第4个产品
---通知等待区的消费者可以取产品了---
消费者取走了第4个产品

一、 课程设计目的 在多道程序环境下,进程同步问题十分重要,通过解决“生产者-消费者问题,可以帮助我们更好的理解进程同步的概念及实现方法。掌握线程创建和终止的方法,加深对线程和进程概念的理解,会用同步与互斥方法实现线程之间的进行操作。 在学习操作系统课程的基础上,通过实践加深对进程同步的认识,同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。 二、 课程设计内容 模拟仿真“生产者-消费者问题的解决过程及方法。 三、 系统分析与设计 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、付费专栏及课程。

余额充值