2016专题训练II-黄华 多线程打印管理器

来源:互联网 发布:淘宝16年售假处罚降权 编辑:程序博客网 时间:2024/05/16 04:42

目标

创建多线程打印管理器,并通过 wait/notify 等机制实现线程同步控制。要求创建若干线程模拟打印客户程序,并创建单个线程模拟打印管理器处理打印作业,打印管理器要求采用单态( Singleton )设计。系统基本类图结构参考如下。

注意:本题需通过文件打包的方式提交。

参考设计:

class diagram

一、 创建 PrintJob 类;

二、 创建 FullQueueException 、 EmptyQueueException 异常类;

三、 创建接口 Queue 及其实现类 CircularQueue , Queue 至少包括 addBack 和 removeFront 方法,可能分别抛出上述异常, CircularQueue 为固定长度循环队列;

四、 创建 Producer 类;

  1. Producer 类必须实现 Runnable 接口;
  2. 编写构造方法初始化其实例变量;
  3. run 方法需根据 numberOfJobs 属性产生一定量的打印作业,通过 producerName 和作业编号设置打印作业的名称。打印作业的页数由 sizeOfJobs 属性指定;
  4. 通过打印管理器的 addJob 方法添加打印作业,该方法可能抛出 FullQueueException 异常,因此需要处理此异常。添加打印作业时,要求输出添加打印作业到打印队列的信息。
  5. Producer 在添加打印作业到打印队列时,必须根据 delayBetweenJobs 属性的值 sleep 一定时间。

五、 创建 Printer 类

  1. 构造 Printer 类。
  2. 编写相应的构造方法初始化其属性。 设置合适的打印队列大小,至少要能够容纳 5 个打印作业。
  3. 要求使用单态(体)模式实现该类。
  4. 属性 printQueue 为 FIFO (先进先出)队列,用于记录所有发送到该打印机的打印作业。 Queue 为 FIFO 队列的接口, CircularQueue 类实现了固定长度的队列,其 addBack 和 removeFront 方法可能抛出 FullQueueException 和 EmptyQueueException 异常。
  5. 编写公有的同步( synchronized )方法 addJob ,该方法可能抛出 FullQueueException 异常
  6. 编写私有同步方法 getJob ,该方法可能抛出 EmptyQueueException 异常。
  7. 编写公有同步方法 halt ,该方法将 stateIsRunning 设置为 false 。
  8. 编写 run 方法,该方法为打印管理器的核心,在终止之前始终循环。从队列中获取一个打印作业后,输出作业开始的信息(以及作业的名称),然后处理此作业(用 sleep 替代,每页 sleep 一定的时间,可以设置为 500 毫秒 / 页),然后输出作业结束信息。如果打印队列为空,则输出打印管理器等待打印作业的信息。
  9. 本练习的难点在于在何处使用 wait 和 notify 。 提示 : 对 Printer 对象 需通过 wait/notify 进行同步。

六、 创建 TestPrinter 程序

  1. 该类仅包含一个 main 方法。
  2. 在 main 方法中创建三个打印客户对象,每个打印客户具有不同的打印特性:如打印页数多少(作业大小从 5 页到 25 页),打印速度快慢(作业打印时间从 2 秒到 10 秒等)。
  3. 创建打印管理器线程,将该线程的优先级设置为最高,开始执行该线程。
  4. 创建三个打印客户线程,分别开始执行之。
  5. 使用 join 方法使每个打印客户线程执行完毕。
  6. 最后终止打印管理器的执行。

七、 输出结果示例:

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‘那篇博客),但是无法得到正确的结果,还待研究

0 0
原创粉丝点击