生产者消费者报告.docx
- 文档编号:11960445
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:18
- 大小:761.84KB
生产者消费者报告.docx
《生产者消费者报告.docx》由会员分享,可在线阅读,更多相关《生产者消费者报告.docx(18页珍藏版)》请在冰豆网上搜索。
生产者消费者报告
河北 建 筑工程 学院
实 验 报 告
年月 日
班级
物联142
姓名
孙胜杰
学号
20143260218
评分
实验台号
同组人员
实验名称
经典进程同步问题---生产者消费者问题模拟实现
课程名称
操作系统
仪器名称
型号规格
仪器编号
装有eclipse软件和Java开发环境的PC机一台
一实验目的
1深刻理解进程同步的概念。
2掌握经典同步问题,生产者——消费者问题。
二实验设备
PC机
三实验内容
在Java开发环境下模拟经典进程同步问题,生产者——消费者问题。
四程序的主要代码
package生产者与消费者问题;
importjava.util.LinkedList;
import java.util.Scanner;
classStorage{
ﻩ// 仓库最大存储量
ﻩprivate finalint MAX_SIZE=100;
ﻩ//仓库存储的载体
privateLinkedList<Object>list =newLinkedList
//生产num个产品
publicvoidproduce(intnum)
ﻩ{
ﻩﻩ//同步代码段
ﻩﻩsynchronized(list)
ﻩﻩ{
ﻩ// 如果仓库剩余容量不足
ﻩﻩwhile(list.size()+num>MAX_SIZE)
ﻩﻩ{
ﻩﻩﻩSystem.out.println("要生产的产品数量:
" +num +"\t库存量:
"+ list.size()+"\t暂时不能执行生产任务!
");
ﻩﻩﻩSystem.out.println("进行生产操作(1),还是消费操作(0)?
");
ﻩﻩﻩﻩtry
ﻩﻩﻩ{
ﻩ//由于条件不满足,生产阻塞
ﻩﻩﻩﻩﻩlist.wait();
ﻩﻩ}
ﻩcatch(InterruptedExceptione)
ﻩﻩ{
ﻩe.printStackTrace();
ﻩﻩﻩﻩ}
ﻩﻩ}
//生产条件满足情况下,生产num个产品
ﻩfor(inti = 1;i<=num;++i)
ﻩ{
ﻩlist.add(newObject());
ﻩ}
ﻩﻩSystem.out.println("已经生产产品数:
" +num +"\t现库存量:
" +list.size());
ﻩSystem.out.println("进行生产操作
(1),还是消费操作(0)?
");
ﻩﻩlist.notifyAll();
ﻩﻩ}
ﻩ}
//消费num个产品
ﻩpublicvoidconsume(int num)
ﻩ{
ﻩ// 同步代码段
synchronized (list)
ﻩ{
ﻩ// 如果仓库存储量不足
ﻩwhile (list.size()< num)
ﻩ{
ﻩSystem.out.println("要消费的产品数量:
"+num+"\t库存量:
"
ﻩﻩﻩﻩﻩ+list.size() + "\t暂时不能执行生产任务!
");
System.out.println("进行生产操作(1),还是消费操作(0)?
");
ﻩﻩﻩﻩtry
ﻩ{
ﻩﻩ//由于条件不满足,消费阻塞
ﻩﻩlist.wait();
}
ﻩcatch(InterruptedExceptione)
ﻩﻩ{
ﻩﻩe.printStackTrace();
ﻩﻩﻩ}
ﻩﻩﻩ}
ﻩﻩ// 消费条件满足情况下,消费num个产品
ﻩﻩfor(inti=1;i<=num;++i)
ﻩﻩ{
ﻩlist.remove();
ﻩ}
ﻩSystem.out.println("已经消费产品数:
"+num+"\t现库存量为:
"+ list.size());
ﻩSystem.out.println("进行生产操作
(1),还是消费操作(0)?
");
ﻩlist.notifyAll();
ﻩ}
}
//get/set方法
public LinkedList
ﻩ{
ﻩreturnlist;
}
ﻩpublicvoidsetList(LinkedList
{
this.list= list;
ﻩ}
ﻩpublicintgetMAX_SIZE()
ﻩ{
ﻩﻩreturnMAX_SIZE;
}
}
//生产者类Producer继承线程类Thread
classProducerextendsThread
{
//每次生产的产品数量
ﻩprivate intnum;
ﻩ//所在放置的仓库
ﻩprivateStoragestorage;
ﻩ//构造函数,设置仓库
ﻩpublic Producer(Storage storage)
ﻩ{
this.storage =storage;
ﻩ}
ﻩ//线程run函数
ﻩpublicvoidrun()
{
ﻩproduce(num);
ﻩ}
ﻩ//调用仓库Storage的生产函数
ﻩpublic void produce(intnum)
{
ﻩstorage.produce(num);
ﻩ}
// get/set方法
public int getNum()
ﻩ{
ﻩreturnnum;
ﻩ}
ﻩpublic void setNum(int num)
ﻩ{
ﻩﻩthis.num =num;
ﻩ}
ﻩpublicStoragegetStorage()
ﻩ{
returnstorage;
}
ﻩpublic voidsetStorage(Storage storage)
ﻩ{
this.storage = storage;
ﻩ}
}
//消费者类Consumer继承线程类Thread
class Consumerextends Thread
{
// 每次消费的产品数量
privateintnum;
// 所在放置的仓库
ﻩprivateStoragestorage;
ﻩ//构造函数,设置仓库
publicConsumer(Storagestorage)
{
ﻩﻩthis.storage=storage;
ﻩ}
//线程run函数
ﻩpublic void run()
{
ﻩconsume(num);
ﻩ}
//调用仓库Storage的生产函数
publicvoidconsume(int num)
ﻩ{
ﻩstorage.consume(num);
}
ﻩ//get/set方法
ﻩpublicintgetNum()
{
returnnum;
ﻩ}
ﻩpublicvoidsetNum(intnum)
{
this.num=num;
ﻩ}
ﻩpublicStoragegetStorage()
{
ﻩﻩreturnstorage;
}
ﻩpublicvoid setStorage(Storagestorage)
ﻩ{
this.storage=storage;
ﻩ}
}
public class ProducerAndConsumer
{
ﻩpublicstatic voidmain(String[]args)
{
ﻩ// 仓库对象
ﻩStoragestorage=new Storage();
ﻩ//生产者对象 ﻩ
Producerp1 =newProducer(storage);
ﻩProducerp2=newProducer(storage);
ﻩﻩProducerp3=newProducer(storage);
ﻩProducerp4=newProducer(storage);
Producer p5 =newProducer(storage);
ﻩProducer p6 =new Producer(storage);
Producer p7 =newProducer(storage);
ﻩﻩProducerp8=new Producer(storage);
ﻩProducer p9 = newProducer(storage);
ﻩProducerp10 =newProducer(storage);
// 消费者对象
ﻩConsumerc1=new Consumer(storage);
Consumer c2=newConsumer(storage);
ﻩﻩConsumer c3=newConsumer(storage);
ﻩConsumerc4 =new Consumer(storage);
ﻩConsumerc5 =newConsumer(storage);
ﻩﻩConsumerc6= newConsumer(storage);
Consumerc7= newConsumer(storage);
ﻩﻩConsumerc8 =newConsumer(storage);
Consumer c9=newConsumer(storage);
Consumerc10=newConsumer(storage);
ﻩSystem.out.println("已生产产品数量:
0\t已消费产品数量:
0\t库存量:
0\t最大存储空间:
100");
ﻩSystem.out.println("进行生产操作(1),还是消费操作(0)?
");
ﻩScannerisProduer=newScanner(System.in);
ﻩfor(inti=1;i<10;i++){
ﻩﻩ//System.out.println("进行生产操作
(1),还是消费操作(0)?
");
ﻩﻩﻩif(isProduer.nextInt()==1){
ﻩSystem.out.print("请输入要生产的产品数量:
");
ﻩﻩﻩScannerp11=newScanner(System.in);
ﻩ
ﻩﻩﻩif(i==1){
ﻩﻩp1.setNum(p11.nextInt());
ﻩp1.start();
ﻩﻩﻩ}else if(i==2){
ﻩﻩﻩp2.setNum(p11.nextInt());
p2.start();
ﻩﻩ}else if(i==3){
ﻩﻩp3.setNum(p11.nextInt());
ﻩp3.start();
ﻩﻩﻩ}
ﻩﻩelseif(i==4){
ﻩﻩp4.setNum(p11.nextInt());
ﻩﻩﻩﻩp4.start();
ﻩﻩ}
ﻩﻩelseif(i==5){
ﻩﻩp5.setNum(p11.nextInt());
p5.start();
ﻩﻩﻩ}else if(i==6){
ﻩp6.setNum(p11.nextInt());
ﻩﻩp6.start();
ﻩﻩ}else if(i==7){
ﻩﻩﻩﻩp7.setNum(p11.nextInt());
ﻩﻩp7.start();
ﻩﻩ}
ﻩﻩelseif(i==8){
ﻩﻩﻩp8.setNum(p11.nextInt());
ﻩﻩﻩﻩp8.start();
ﻩﻩﻩ}
ﻩelseif(i==9){
ﻩp9.setNum(p11.nextInt());
ﻩﻩﻩp9.start();
ﻩ}
ﻩﻩelseif(i==10){
ﻩﻩﻩﻩp10.setNum(p11.nextInt());
ﻩﻩﻩﻩp10.start();
ﻩﻩ}
ﻩﻩﻩ
ﻩ
ﻩﻩ}else{
ﻩﻩSystem.out.print("请输入要消费的产品数量:
");
ﻩﻩScannerp12=newScanner(System.in);
ﻩ
ﻩﻩ
if(i==1){
ﻩﻩﻩc1.setNum(p12.nextInt());
ﻩﻩﻩc1.start();
ﻩ}else if(i==2){
ﻩc2.setNum(p12.nextInt());
ﻩﻩﻩﻩc2.start();
ﻩ}elseif(i==3){
ﻩc3.setNum(p12.nextInt());
ﻩc3.start();
ﻩ}
ﻩelseif(i==4){
ﻩﻩc4.setNum(p12.nextInt());
c4.start();
ﻩﻩ}
elseif(i==5){
ﻩﻩﻩc5.setNum(p12.nextInt());
ﻩc5.start();
ﻩﻩ}elseif(i==6){
ﻩﻩﻩc6.setNum(p12.nextInt());
ﻩﻩﻩc6.start();
ﻩﻩﻩ}elseif(i==7){
ﻩﻩﻩc7.setNum(p12.nextInt());
ﻩﻩc7.start();
ﻩﻩﻩ}elseif(i==8){
ﻩﻩﻩc8.setNum(p12.nextInt());
ﻩc8.start();
ﻩﻩ}
ﻩﻩelse if(i==9){
c9.setNum(p12.nextInt());
ﻩﻩﻩc9.start();
ﻩﻩﻩ}
ﻩﻩelseif(i==10){
ﻩﻩﻩﻩﻩc10.setNum(p12.nextInt());
ﻩﻩc10.start();
ﻩﻩ}
ﻩ}
ﻩ}
ﻩ}
}
五、实验结果
本程序应用Java软件开发,没有引入界面,需要使用可以运行java的eclipse等软件运行。
程序目录为:
生产者与消费者问题\生产者消费者问题代码\src\生产者与消费者问题 下的ProducerAndConsumer.java文件。
程序运行后,界面如图所示:
此时,输入‘1’表示进入生产操作,输入‘0’表示进入消费操作.。
当输入‘1’时,显示如下:
现在输入要生产的产品数量。
一直重复该操作,直至如图情况:
此时表示存储空间已满,不能继续进行生产操作。
下面进行消费操作:
此时,消费20个后,库存量仍不足以生产之前的40个,生产操作继
阻塞。
下面继续进行消费操作:
此时,消费50个,库存量为28,已经足够进行之前阻塞的生产40
个的操作,具体情况如上图所示。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 生产者 消费者 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)