- 浏览: 283528 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
CodeLove:
如果包含<,(,)...等特殊字符呢
Python变量名检测 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,只能算是 2、8、10、16 几 ...
java实现的任意进制转换 -
mychaoyue2011:
在本地执行了几遍,结果都是:s2开始休眠s1开始休眠s2休眠结 ...
Java线程学习笔记(四)线程join -
chxiaowu:
不错!
Java版的树 -
TenAclock:
这个例子 做不到“学生都交完” 考试结束,只能做到等到考试时间 ...
Java线程学习笔记(十一) DelayQueue的应用
采用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
模拟结束
停止射击
停止装子弹
发表评论
-
Consider the following code: What will be printed?
2010-09-24 20:30 978Consider the following code: Wh ... -
Java 基础复习笔记一
2010-06-04 02:03 1147这两天复习java的基础知识,把一些自己认为比较有用的点记录下 ... -
Java 转义字符
2010-06-03 21:21 1018\n 回车(\u000a) \t 水平制表符(\u0009) ... -
Java 控制台下显示文件结构
2010-05-27 00:10 3275题目: 编写一个Java ... -
Java得到类目录
2010-05-26 23:22 1192String path = MainTest.class.ge ... -
Java文件压缩
2010-05-23 21:54 1237package com.woxiaoe.study.io ... -
UDP传输图片的尝试
2010-05-22 18:05 9849UDP是不可靠的,发送的数据不一定会到达,且顺序不一定 ... -
【转载】Java String.Format() 方法及参数说明
2010-05-15 22:18 1341JDK1.5中,String类新增了一个很有用的静态方法S ... -
【转载】String.format函数使用方法介绍
2010-05-15 22:17 1214http://edu.codepub.com/2009/111 ... -
Java线程学习笔记(十一) DelayQueue的应用
2010-05-01 00:34 15717DelayQueue 是一个无界的BlockingQueue ... -
Java线程学习笔记(十)CountDownLatch 和CyclicBarrier
2010-04-30 21:04 2857CountDownLatch : 一个同步辅助类,在完成一组 ... -
Java线程学习笔记(九)生产者消费者问题
2010-04-29 22:27 1746用多线程来模拟生产者消费者问题。用到BlockingQueue ... -
Java线程学习笔记(八)线程之间的协作
2010-04-26 23:13 1841wait()与notifyAll() 调用sleep ... -
Java线程学习笔记(七)java中递增不是原子性
2010-04-24 23:00 2936以下为测试代码,通过一个自增函数得到最新的值,玩Set你存,看 ... -
Java线程学习笔记(六)在其他对象上同步
2010-04-24 22:47 1376package com.woxiaoe.study.threa ... -
Java线程学习笔记(五)资源共享问题
2010-04-24 21:04 1294IncreaseClient 中持有一个base,每次调用起i ... -
Java线程学习笔记(四)线程join
2010-04-24 20:06 1312《Java编程思想》的一个例子,如果某个线程在另一个线程t上调 ... -
基于java的图(四) 强连通组件
2010-04-22 21:06 1558有向图中, u可达v不一定意味着v可达u. 相互可达则属于同一 ... -
基于java的图(三) 图的拓扑排序
2010-04-21 16:14 1895相关: 基于java的图的实现 基于java ... -
基于java的图的实现(二) 图的两种遍历
2010-04-20 21:51 2124图的实现见http://www.iteye.com/topic ...
相关推荐
"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的环境中创建一个这样的程序。这意味着我们将...
生产者-消费者问题是操作系统中经典的进程同步问题,它模拟了实际生产环境中的资源分配与消耗。在这个问题中,生产者进程负责生成数据并放入有限大小的缓冲区,而消费者进程则从缓冲区取出数据进行消费。为了确保...
本课程设计的目的是通过设计一个消费者进程与生产者进程的同步模拟系统,认识进程间的同步机制生产者消费者问题是一个著名的进程同步问题。 (1) 有一群生产者进程在生产消息, 并将消息提供给消费者进程去消费。为...
生产者-消费者问题是并发编程中的一个抽象模型,模拟了两个不同的角色:生产者和消费者。生产者负责创建或生产某种资源,而消费者则负责消耗这些资源。在实际系统中,这可以表现为一个进程生产数据,另一个进程消费...
在这个"生产者消费者模拟"项目中,我们看到它不是基于MFC(Microsoft Foundation Classes)框架实现的,而是运行在DOS环境下。DOS是一种较老的操作系统,它不支持多线程或高级的并发机制,因此在DOS下实现生产者消费...
总结来说,进程同步模拟设计——生产者和消费者问题是一个典型的多线程同步问题,通过使用信号量等同步机制,我们可以实现并发进程间的有效协作,保证数据的一致性和系统的正常运行。在实际编程中,理解并熟练运用...
操作系统实验中的“生产者与消费者问题”是一个经典的多线程同步问题,源于计算机科学理论,主要探讨如何在并发环境中有效地管理共享资源。本实验通过使用C#编程语言来模拟这个问题,帮助学生理解线程同步、互斥访问...
在本实验中,我们将探讨如何使用Java来模拟生产者-消费者问题。 生产者-消费者问题的核心在于共享资源的管理,确保生产者不会在消费者未完成消费时过度生产,同时也要防止消费者在无数据可消费时浪费资源。Java中的...
模拟仿真“生产者-消费者”问题的解决过程及方法。 三、 系统分析与设计 1、 系统分析 在OS中引入进程后,虽然提高了资源的利用率和系统的吞吐量,但由于进程的异步性,也会给系统造成混乱,尤其是在他们争用临界...
主程序可能会根据需要创建多个生产者和消费者实例,模拟并发环境。 5. **线程同步机制**:如前所述,可以使用`Monitor`、`Semaphore`或`BlockingCollection`等来控制生产者和消费者的同步。 通过分析和运行这个...
内容:编程实现生产者-消费者问题的模拟。 基本要求: 1. 生产者消费者对缓冲区进行互斥操作。 2. 缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3. 生产者消费者各循环操作10...
生产者消费者问题是多进程或线程同步的经典案例,它展示了如何在共享资源有限的情况下协调生产者和消费者的活动。在这个问题中,生产者负责生成产品,而消费者则负责消耗这些产品。为了解决这个问题,我们需要利用...
在本文中,我们将深入探讨如何在集群模式下模拟Kafka的生产者和消费者。Kafka是一种分布式流处理平台,常用于大数据实时处理和消息传递。它由Apache开发,以其高吞吐量、低延迟和可扩展性而闻名。 首先,我们要理解...
生产者-消费者问题是一个经典的多线程同步问题,它源于操作系统设计中的并发概念。在这个问题中,有两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责生成产品并将其放入一个共享的有限大小的...
在这个"MFC生产者消费者问题模拟"程序中,我们将探讨如何使用MFC来实现生产者消费者模型,并通过多线程技术解决资源共享和数据一致性问题。 生产者消费者问题是这样的:有一块共享内存区域(比如一个队列),生产者...
使用的生产者和消费者模型具有如下特点: (1)本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。生产者可以把产品放到目前某一个空缓冲区中。 (2)消费者只消费指定生产者的产品。 (3)在测试用例文件中指定...