2016专题训练II-黄华 多线程打印管理器
来源:互联网 发布:淘宝16年售假处罚降权 编辑:程序博客网 时间:2024/05/16 04:42
目标
创建多线程打印管理器,并通过 wait/notify 等机制实现线程同步控制。要求创建若干线程模拟打印客户程序,并创建单个线程模拟打印管理器处理打印作业,打印管理器要求采用单态( Singleton )设计。系统基本类图结构参考如下。
注意:本题需通过文件打包的方式提交。
参考设计:
一、 创建 PrintJob 类;
二、 创建 FullQueueException 、 EmptyQueueException 异常类;
三、 创建接口 Queue 及其实现类 CircularQueue , Queue 至少包括 addBack 和 removeFront 方法,可能分别抛出上述异常, CircularQueue 为固定长度循环队列;
四、 创建 Producer 类;
- Producer 类必须实现 Runnable 接口;
- 编写构造方法初始化其实例变量;
- run 方法需根据 numberOfJobs 属性产生一定量的打印作业,通过 producerName 和作业编号设置打印作业的名称。打印作业的页数由 sizeOfJobs 属性指定;
- 通过打印管理器的 addJob 方法添加打印作业,该方法可能抛出 FullQueueException 异常,因此需要处理此异常。添加打印作业时,要求输出添加打印作业到打印队列的信息。
- Producer 在添加打印作业到打印队列时,必须根据 delayBetweenJobs 属性的值 sleep 一定时间。
五、 创建 Printer 类
- 构造 Printer 类。
- 编写相应的构造方法初始化其属性。 设置合适的打印队列大小,至少要能够容纳 5 个打印作业。
- 要求使用单态(体)模式实现该类。
- 属性 printQueue 为 FIFO (先进先出)队列,用于记录所有发送到该打印机的打印作业。 Queue 为 FIFO 队列的接口, CircularQueue 类实现了固定长度的队列,其 addBack 和 removeFront 方法可能抛出 FullQueueException 和 EmptyQueueException 异常。
- 编写公有的同步( synchronized )方法 addJob ,该方法可能抛出 FullQueueException 异常
- 编写私有同步方法 getJob ,该方法可能抛出 EmptyQueueException 异常。
- 编写公有同步方法 halt ,该方法将 stateIsRunning 设置为 false 。
- 编写 run 方法,该方法为打印管理器的核心,在终止之前始终循环。从队列中获取一个打印作业后,输出作业开始的信息(以及作业的名称),然后处理此作业(用 sleep 替代,每页 sleep 一定的时间,可以设置为 500 毫秒 / 页),然后输出作业结束信息。如果打印队列为空,则输出打印管理器等待打印作业的信息。
- 本练习的难点在于在何处使用 wait 和 notify 。 提示 : 对 Printer 对象 需通过 wait/notify 进行同步。
六、 创建 TestPrinter 程序
- 该类仅包含一个 main 方法。
- 在 main 方法中创建三个打印客户对象,每个打印客户具有不同的打印特性:如打印页数多少(作业大小从 5 页到 25 页),打印速度快慢(作业打印时间从 2 秒到 10 秒等)。
- 创建打印管理器线程,将该线程的优先级设置为最高,开始执行该线程。
- 创建三个打印客户线程,分别开始执行之。
- 使用 join 方法使每个打印客户线程执行完毕。
- 最后终止打印管理器的执行。
七、 输出结果示例:
C: Print manager is starting up.
C: Waiting on a job to print.
P: Adding job 'Fred#1' to the queue
C: Starting job 'Fred#1'
P: Adding job 'Elizabeth#1' to the queue
P: Adding job 'Simon#1' to the queue
C: Completed job 'Fred#1'
C: Starting job 'Elizabeth#1'
P: Adding job 'Fred#2' to the queue
P: Adding job 'Simon#2' to the queue
C: Completed job 'Elizabeth#1'
C: Starting job 'Simon#1'
P: Adding job 'Fred#3' to the queue
C: Completed job 'Simon#1'
C: Starting job 'Fred#2'
P: Adding job 'Elizabeth#2' to the queue
P: Adding job 'Simon#3' to the queue
C: Completed job 'Fred#2'
C: Starting job 'Simon#2'
C: Completed job 'Simon#2'
C: Starting job 'Fred#3'
P: Adding job 'Fred#4' to the queue
C: Completed job 'Fred#3'
C: Starting job 'Elizabeth#2'
P: Adding job 'Fred#5' to the queue
C: Completed job 'Elizabeth#2'
C: Starting job 'Simon#3'
P: Adding job 'Elizabeth#3' to the queue
C: Completed job 'Simon#3'
C: Starting job 'Fred#4'
C: Completed job 'Fred#4'
C: Starting job 'Fred#5'
C: Completed job 'Fred#5'
C: Starting job 'Elizabeth#3'
C: Completed job 'Elizabeth#3'
C: Waiting on a job to print.
C: Print manager is halted.
CircleQueue (java 循环队列 (正确无误))
https://github.com/RenjiaLu9527/Something_i/blob/manyThread/CircleQueue
Main类,多线程打印(有细节出错)
https://github.com/RenjiaLu9527/Something_i/blob/manyThread/Main
;这段代码我觉得思路没有问题(见我的’程设II‘那篇博客),但是无法得到正确的结果,还待研究
- 2016专题训练II-黄华 多线程打印管理器
- 2016专题训练II-黄华 比赛排名
- 2016专题训练II-黄华 网络爬虫
- 2016 SCUT 专题训练 简单dp
- 期望专题 三国杀之 黄盖
- [专题训练]数论专题1
- 商界黄埔-特种兵训练营
- ACM专题训练
- HDU 专题训练
- 数论专题训练D
- 数论专题训练K
- 搜索专题训练(2)
- 数学专题训练2
- 数学专题训练3
- 数学专题训练4
- 矩阵专题训练1
- 线段树专题训练
- 后缀数组专题训练
- DTD中的实体Entity
- [iOS] UIBezierPath贝塞尔曲线常用方法
- 125个优化网站可用性的小点子(上)
- selenium初次应用体验
- org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actua
- 2016专题训练II-黄华 多线程打印管理器
- 125个优化网站可用性的小点子(下)
- iOS 开发者中的公司账号与个人账号之间有什么区别?
- 守护进程
- 关于利用死锁定理关于化简资源分配图(RAG)算法中“两不点”备忘
- FloodFill(洪水填充 )算法
- 【POJ2777】Count Color-线段树区间更新
- poj1068
- faster-rcnn学习笔记(1)