`
woxiaoe
  • 浏览: 283528 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

生产消费者的模拟

    博客分类:
  • Java
阅读更多

采用Java 多线程技术,设计实现一个符合生产者和消费者问题的程序。对一个对象(枪膛)进行操作,
 其最大容量是12颗子弹。生产者线程是一个压入线程,它不断向枪膛中压入子弹;消费者线程是一个射出线程,
它不断从枪膛中射出子弹。
 要求:
 (1)给出分析过程说明。
 (2)程序输出,要模拟体现对枪膛的压入和射出操作;
(3)设计程序时应考虑到两个线程的同步问题。

这是一道典型的生产者消费这问题,同时可以用BlockingQueue得到很好的实现。

创建一个Gun的类,其拥有Bullet,Shooter,BulletProductor三个内部类。

BulletProductor 负责生产子弹,挡子弹个数大于12者不生产。

Shooter 负责射击 即消耗子弹。

具体代码如下:

package exam.b;

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 4、	采用Java 多线程技术,设计实现一个符合生产者和消费者问题的程序。对一个对象(枪膛)进行操作,
 * 其最大容量是12颗子弹。生产者线程是一个压入线程,它不断向枪膛中压入子弹;消费者线程是一个射出线程,
 * 它不断从枪膛中射出子弹。
 * 	要求:
 * 	(1)给出分析过程说明。
 * 	(2)程序输出,要模拟体现对枪膛的压入和射出操作;
 * (2)设计程序时应考虑到两个线程的同步问题。

 * @author 小e
 *
 * 2010-5-27 下午07:39:26
 */
public class Gun {
	class Bullet{
		int id = bulletCounter++;
		@Override
		public String toString() {
			// TODO Auto-generated method stub
			return "" + id;
		}
	}
	class Shooter implements Runnable{
		BlockingQueue<Bullet> bullets;
		Random r = new Random();
		Shooter(BlockingQueue<Bullet> bullets){
			this.bullets = bullets;
		}
		void shoot() throws InterruptedException{
			Bullet bullet = bullets.take();
			System.out.println("射出子弹:" + bullet + "---枪膛子弹数量:" + bullets.size());
		}
		@Override
		public void run() {
			try {
				while(!Thread.interrupted()){
					shoot();
					TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
				System.out.println("停止射击");
			}
			
		}
		
	}
	class BulletProductor implements Runnable{
		BlockingQueue<Bullet> bullets;
		Random r = new Random();
		public BulletProductor(BlockingQueue<Bullet> bullets) {
			this.bullets = bullets;
		}
		public void product(){
			if(bullets.size() < BULLET_SIZE){//枪膛未满
				Bullet bullet = new Bullet();
				bullets.add(bullet);
				System.out.println("装入子弹:" + bullet + "---枪膛子弹数量:" + bullets.size());
			}
		}
		@Override
		public void run() {
			try {
				while(!Thread.interrupted()){
					product();
					TimeUnit.MILLISECONDS.sleep(r.nextInt(500));
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
				System.out.println("停止装子弹");
			}
		}
		
	}
	static int bulletCounter = 0;
	static final int BULLET_SIZE = 12;
	BlockingQueue<Bullet> bullets;
	ExecutorService exec;
	Gun(ExecutorService exec){
		this.bullets = new LinkedBlockingQueue<Bullet>();
		this.exec = exec;
	}
	public void action(){
		exec.execute(new BulletProductor(bullets));
		exec.execute(new Shooter(bullets));
	}
	public static void main(String[] args) throws InterruptedException {
		ExecutorService exec = Executors.newCachedThreadPool();
		Gun gun = new Gun(exec);
		gun.action();
		TimeUnit.SECONDS.sleep(6);
		exec.shutdownNow();
		System.out.println("模拟结束");
	}
}

 

outPut:

射出子弹:0---枪膛子弹数量:0
装入子弹:0---枪膛子弹数量:0
装入子弹:1---枪膛子弹数量:1
装入子弹:2---枪膛子弹数量:2
装入子弹:3---枪膛子弹数量:3
射出子弹:1---枪膛子弹数量:2
装入子弹:4---枪膛子弹数量:3
装入子弹:5---枪膛子弹数量:4
射出子弹:2---枪膛子弹数量:3
装入子弹:6---枪膛子弹数量:4
装入子弹:7---枪膛子弹数量:5
射出子弹:3---枪膛子弹数量:4
装入子弹:8---枪膛子弹数量:5
装入子弹:9---枪膛子弹数量:6
射出子弹:4---枪膛子弹数量:5
装入子弹:10---枪膛子弹数量:6
装入子弹:11---枪膛子弹数量:7
射出子弹:5---枪膛子弹数量:6
装入子弹:12---枪膛子弹数量:7
装入子弹:13---枪膛子弹数量:8
装入子弹:14---枪膛子弹数量:9
射出子弹:6---枪膛子弹数量:8
射出子弹:7---枪膛子弹数量:7
装入子弹:15---枪膛子弹数量:8
射出子弹:8---枪膛子弹数量:7
装入子弹:16---枪膛子弹数量:8
装入子弹:17---枪膛子弹数量:9
装入子弹:18---枪膛子弹数量:10
射出子弹:9---枪膛子弹数量:9
装入子弹:19---枪膛子弹数量:10
射出子弹:10---枪膛子弹数量:9
装入子弹:20---枪膛子弹数量:10
装入子弹:21---枪膛子弹数量:11
装入子弹:22---枪膛子弹数量:12
射出子弹:11---枪膛子弹数量:11
模拟结束
停止射击
停止装子弹

0
1
分享到:
评论

相关推荐

    C语言编程模拟生产者和消费者问题.pdf

    "C语言编程模拟生产者和消费者问题" 本文档主要介绍了使用C语言编程来模拟生产者和消费者问题的解决方案。生产者和消费者问题是操作系统中的一种经典问题,它们之间的同步是通过使用PV操作来实现的。PV操作由P操作...

    生产者消费者模拟程序

    printf("*生产者消费者模拟\n"); printf("---------\n"); printf("*请输入字符串:\n"); scanf("%s",str); //string数组存放将要产生的字符 len=strlen(str); count=len; //输入字符的个数 init(); //初始化 ...

    操作系统生产者——消费者模拟程序

    操作系统中的生产者-消费者问题是一个经典的多线程同步问题,源于1965年由Edsger Dijkstra提出的银行家算法。这个问题的设定是有一个共享资源(例如一个缓冲区),生产者线程负责生成数据并放入缓冲区,而消费者线程...

    模拟生产者消费者程序

    在模拟生产者消费者程序中,我们可以使用P(等待)和V(信号)操作来控制生产者和消费者的动作。 标题“模拟生产者消费者程序”指的是我们将在一个没有依赖Windows API的环境中创建一个这样的程序。这意味着我们将...

    生产者-消费者问题的模拟实现(课设含源代码).doc

    生产者-消费者问题是操作系统中经典的进程同步问题,它模拟了实际生产环境中的资源分配与消耗。在这个问题中,生产者进程负责生成数据并放入有限大小的缓冲区,而消费者进程则从缓冲区取出数据进行消费。为了确保...

    模拟仿真“生产者-消费者”问题的解决过程及方法

    本课程设计的目的是通过设计一个消费者进程与生产者进程的同步模拟系统,认识进程间的同步机制生产者消费者问题是一个著名的进程同步问题。 (1) 有一群生产者进程在生产消息, 并将消息提供给消费者进程去消费。为...

    模拟消费者生产者实验

    生产者-消费者问题是并发编程中的一个抽象模型,模拟了两个不同的角色:生产者和消费者。生产者负责创建或生产某种资源,而消费者则负责消耗这些资源。在实际系统中,这可以表现为一个进程生产数据,另一个进程消费...

    生产者消费者模拟

    在这个"生产者消费者模拟"项目中,我们看到它不是基于MFC(Microsoft Foundation Classes)框架实现的,而是运行在DOS环境下。DOS是一种较老的操作系统,它不支持多线程或高级的并发机制,因此在DOS下实现生产者消费...

    进程同步模拟设计--生产者和消费者问题

    总结来说,进程同步模拟设计——生产者和消费者问题是一个典型的多线程同步问题,通过使用信号量等同步机制,我们可以实现并发进程间的有效协作,保证数据的一致性和系统的正常运行。在实际编程中,理解并熟练运用...

    操作系统实验-模拟生产者与消费者问题

    操作系统实验中的“生产者与消费者问题”是一个经典的多线程同步问题,源于计算机科学理论,主要探讨如何在并发环境中有效地管理共享资源。本实验通过使用C#编程语言来模拟这个问题,帮助学生理解线程同步、互斥访问...

    java操作系统生产者消费者问题模拟

    在本实验中,我们将探讨如何使用Java来模拟生产者-消费者问题。 生产者-消费者问题的核心在于共享资源的管理,确保生产者不会在消费者未完成消费时过度生产,同时也要防止消费者在无数据可消费时浪费资源。Java中的...

    操作系统课程设计——模拟生产者与消费者(java)

    模拟仿真“生产者-消费者”问题的解决过程及方法。 三、 系统分析与设计 1、 系统分析 在OS中引入进程后,虽然提高了资源的利用率和系统的吞吐量,但由于进程的异步性,也会给系统造成混乱,尤其是在他们争用临界...

    C#生产者消费者模拟

    主程序可能会根据需要创建多个生产者和消费者实例,模拟并发环境。 5. **线程同步机制**:如前所述,可以使用`Monitor`、`Semaphore`或`BlockingCollection`等来控制生产者和消费者的同步。 通过分析和运行这个...

    生产者-消费者模型模拟进程调度

    内容:编程实现生产者-消费者问题的模拟。 基本要求: 1. 生产者消费者对缓冲区进行互斥操作。 2. 缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3. 生产者消费者各循环操作10...

    用C语言模拟生产者消费者问题

    生产者消费者问题是多进程或线程同步的经典案例,它展示了如何在共享资源有限的情况下协调生产者和消费者的活动。在这个问题中,生产者负责生成产品,而消费者则负责消耗这些产品。为了解决这个问题,我们需要利用...

    kafka模拟生产者消费者(集群模式)实例

    在本文中,我们将深入探讨如何在集群模式下模拟Kafka的生产者和消费者。Kafka是一种分布式流处理平台,常用于大数据实时处理和消息传递。它由Apache开发,以其高吞吐量、低延迟和可扩展性而闻名。 首先,我们要理解...

    简单模拟生产者消费者

    生产者-消费者问题是一个经典的多线程同步问题,它源于操作系统设计中的并发概念。在这个问题中,有两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责生成产品并将其放入一个共享的有限大小的...

    MFC生产者消费者问题模拟

    在这个"MFC生产者消费者问题模拟"程序中,我们将探讨如何使用MFC来实现生产者消费者模型,并通过多线程技术解决资源共享和数据一致性问题。 生产者消费者问题是这样的:有一块共享内存区域(比如一个队列),生产者...

    生产者与消费者 模拟生产者与消费者的实例

    使用的生产者和消费者模型具有如下特点: (1)本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。生产者可以把产品放到目前某一个空缓冲区中。 (2)消费者只消费指定生产者的产品。 (3)在测试用例文件中指定...

Global site tag (gtag.js) - Google Analytics