别着急,答案在文件包里,下面是满分截图:

答案提交代码包

https://download.csdn.net/download/CHINA_CNN/12441022

1、实验要求

本实验要求:以读者订阅报刊杂志为背景,体验多线程生产/订阅模式下的经典应用。

1-1. 业务说明:

1-1.1. 本实验以实际生活中报刊杂志的订阅为业务背景。

1-1.2. 订阅者通常有很多种,他们可以同时向出版社发出订阅申请。

1-1.3. 出版社通常根据自身的资源条件对收到的订阅申请做统一的处理。

1-1.4. 出版社通常能接受并处理的订阅申请量是有一定限度的。

1-1.5. 出版社汇总订阅申请信息后交由独立业务单元处理,直至完毕。

1-1.6. 本业务主要是模拟多读者同时订阅、信息汇总后再行处理的业务情景。

1-1.7. 本实验的关键业务概念:

1) 订阅者,即订阅信息生产者,向共享池中放入订阅信息;

2) 信息汇总,即订阅信息共享池,生产者和消费者共用;

3) 业务单元,即订阅信息消费者,处理订阅者生产的订阅信息。

1-2. 创建工程并配置环境:

1-2.1. 限制1. 创建实验工程,命名为:SE_JAVA_EXP_E046;

1-2.2. 限制2. 创建包,命名为:cn.campsg.java.experiment;

1-2.3. 限制3. 创建包,命名为:cn.campsg.java.experiment.entity。

1-3. 创建订阅池业务类:

1-3.1. 限制1. 在cn.campsg.java.experiment.entity包中创建订阅信息共享池业务类:SharePool。

1-3.2. 为SharePool类创建属性,要求如下:

序号

属性权限

属性名称

属性类型

属性说明

1

private

pool

List<String>

订阅信息共享池,为生产者和消费者服务

2

private

MAX

int

最大订阅量。定为常量,初始化为15。

说明:1.只为上述pool属性实现setter/getter方法;

1-3.3. 为奖项SharePool类创建0参构造器。

1) 在构造器内完成对共享池的初始化创建。

2) 共享池初始化是为了包含最大限量的订阅信息。

1-3.4. 为SharePool创建生成订阅信息的方法,要求如下:

访问权限

方法名称

返回值

方法参数

参数说明

public

produce

void

String media

订阅报刊杂志名称

方法说明

本方法由订阅者调用,生成订阅信息并完成订阅信息的提交。

本方法的业务逻辑实现要求如下:

1)应用同步机制控制本方法的实现;

2) 获取当前订阅信息共享池的信息数量;

3) 当共享池信息数量等于最大订阅量时,输出如下信息并开始等待:

“订阅请求队列已满,等待系统处理订阅请求中……”

4) 当共享池信息数量小于最大订阅量时:

其一,把订阅信息加入到共享池;

其二,在控制台输出如下格式的信息:

"订阅者@"+当前线程名+":订阅《" + media + "》申请已提交.当前订阅数量为:" + 订阅数量

其三,发出完成订阅申请的通知。

1-3.5. 为SharePool创建处理订阅信息的方法,要求如下:

访问权限

方法名称

返回值

方法参数

参数说明

public

consume

void

方法说明

本方法由订阅信息消费者调用,完成订阅信息的处理。

本方法的业务逻辑实现要求如下:

1) 应用同步机制控制本方法的实现;

2) 获取当前订阅信息共享池的信息数量;

3) 当共享池信息数量等于0时,输出如下信息并开始等待:

“处理者@”+当前线程名称+“暂无订阅请求信息,等待中……”

4) 当共享池信息数量不为0时:

其一,从订阅共享池移除一项订阅信息;

其二,在控制台输出如下格式的信息:

"处理者@"+当前线程名+":处理《" + 移除订阅信息 + "》订阅已完毕。尚待处理订阅数量为:" + 剩余订阅数量

其三,发出完成订阅处理的通知。

1-4.  创建订阅生产业务类:

1-4.1. 限制1. 在cn.campsg.java.experiment.entity包中创建订阅信息生产者业务类:Producer。

1) Producer类需要实现线程类接口Runnable,并且实现run方法。

1-4.2. 为Producer类创建订阅信息共享池属性,要求如下:

序号

属性权限

属性名称

属性类型

属性说明

1

private

pool

SharePool

表示订阅信息共享池

2

private

count

int

表示订阅者订阅的数量

说明:无需为上述属性实现对应的setter/getter方法。

1-4.3. 为Producer类创建0参构造器。

1-4.4. 为Producer类创建2参构造器:

1) 两个参数分别表示订阅共享池和订阅的数量;

2) 在构造器内容为对应的属性赋值。

1-4.5. 为Producer类实现生产订阅信息的方法,描述如下:

访问权限

方法名称

返回值

方法参数

参数说明

public

run

void

方法说明

实现本方法,以产生指定数量订阅信息并存放到订阅共享池中。

本方法的业务逻辑实现要求如下:

1) 模拟输出订阅者相关信息,格式如下:

“订阅者@”+当前线程名称+“:订阅”+订阅数量+“份。”;

2) 通过循环方式发出所有指定数量的订阅请求:

其一,当订阅数量发送完毕后,结束订阅并输出如下信息:

“订阅者@”+当前线程名称+“->完成订阅。”

其二,定义计数器,把信息放入到订阅信息共享池并输出如下信息:

“订阅者@”+当前线程名称+“ 在提交第”+计数器+“ 份订阅申请。”

其三,让当前线程休眠半秒钟;

其四,订阅完毕后退出方法。

1-5. 创建订阅处理业务类:

1-5.1. 限制1. 在cn.campsg.java.experiment.entity包中创建订阅信息处理者业务类:Consumer。

1) Consumer类需要实现线程类接口Runnable,并且实现run方法。

1-5.2. 为Consumer类创建订阅信息共享池属性,要求如下:

序号

属性权限

属性名称

属性类型

属性说明

1

private

pool

SharePool

表示待处理的订阅信息共享池

说明:无需为上述属性实现对应的setter/getter方法。

1-5.3. 为Consumer类创建0参构造器。

1-5.4. 为Consumer类创建1参构造器:

1) 参数代表订阅信息共享池;

2) 在构造器内为对应的属性赋值。

1-5.5. 为Consumer类实现处理订阅信息的方法,要求如下:

访问权限

方法名称

返回值

方法参数

参数说明

public

run

void

方法说明

本方法产生指定数量的订阅信息并存放到订阅信息共享池中。

本方法的业务逻辑实现要求如下:

1) 创建处理订阅信息数量的计数器;

2) 通过循环方式处理共享池内的所有订阅信息:

其一,启动计数器,当计数器大于15时,结束处理并输出如下信息:

“本线程完成订阅处理量,即刻退出。处理者@”+当前线程名称

其二,当计数器小于15时,处理共享池内的订阅信息并输出如下信息:

“订阅者@”+当前线程名称+“ :处理第”+计数器+“ 份订阅。”

其三,处理全部完成后,退出信息订阅池。

1-6.  模拟现实生产/处理的结果:

1-6.1. 限制1. 在cn.campsg.java.experiment包中创建主类:MainClass;

1-6.2. 为MainClass创建入口主方法:main;

1-6.3. 在main中,创建1个订阅信息共享池对象;

1-6.4. 在main中,创建5个不同的订阅者,订阅总量为15,共用共享池;

1-6.5. 在main中,创建1个订阅处理类对象,处理所有提交的订阅信息。

2、实现思路

2-1. 创建工程并配置环境。

2-2. 创建订阅池业务类:

2-2.1. 在包cn.campsg.java.experiment.entity中创建奖项类:SharePool;

2-2.2. 为SharePool类定义属性:

1) 订阅信息共享池: private List<String> pool;

2) 最大订阅量: private final int MAX;

3) 为pool属性实现对应的setter/getter方法

2-2.3. 为SharePool类创建默认的0参构造器。

1) 在构造器内创建空的共享池对象,并赋值给pool变量。

2-2.4. 为SharePool类创建生产订阅信息的方法,其形式如下:

  提示

 public void produce(String media) {

}

方法实现逻辑如下:

其一,在方法体内建立对象本身的同步锁处理块:

建立同步锁:synchronized (this) {}

以下业务逻辑,要求在同步块内处理。

其二,判断共享池内的订阅数量:达到MAX时,则输出如下信息并等待:

控制台输出:“订阅请求队列已满,等待系统处理订阅请求中……”

调用系统API开始等待:wait();

其三,若未达到MAX,则把media加入到pool,并输出如下信息:

"订阅者@"+当前线程名+":订阅《" + media + "》申请已提交.当前订阅数量为:" + 订阅数量

  + 提示

当前线程名的获取方法为:Thread.currentThread().getName()

其四,加入共享池后,调用系统API通知方法:notify();

2-2.5. 为SharePool创建订阅信息的处理方法,其形式如下:

  + 提示

 public void  consume() {

}

该方法实现逻辑如下:

其一,在方法体内建立对象本身的同步锁处理块:

建立同步锁:synchronized (this) {}

以下业务逻辑,要求在同步块内处理。

其二,判断共享池内的订阅数量:若为0,则输出如下信息并等待:

控制台输出:“处理者@”+当前线程名称+“暂无订阅请求信息,等待中…”

然后调用系统方法开始等待:wait();

其三,判断共享池内的订阅数量:若不为0,则移除一项订阅信息,并输出如下信息:

移除订阅信息:String media = pool.remove(0);

控制台输出:"处理者@"+当前线程名+":处理《" + media + "》订阅已完毕。尚待处理订阅数量为:" + 剩余订阅数量

其四,处理完毕后,调用系统通知方法:notify();

2-3. 创建订阅生产业务类:

2-3.1. 在包cn.campsg.java.experiment.entity中创建订阅信息生产者业务类:Producer;

2-3.2. 为Producer类定义私有属性:

1) 订阅信息共享池:SharePool pool;

2) 订阅数量:int count;

2-3.3. 为Producer类创建0参构造器;

2-3.4. 为Producer类创建2参构造器,其形式如下:

  + 提示

 public  Producer(SharePool  pool,int num) {

}

1) 参数pool为共享池;参数num为订阅数量;

2) 在构造器内为对应的属性赋值:

this.pool = pool ;

this.count = num ;

2-3.5. 为Producer类实现生产订阅信息的方法,其形式如下:

  + 提示

 public void run() {

}

本方法的业务实现逻辑如下:

1) 定义订阅信息名称变量:String media=“报刊杂志”;

2) 定义订阅信息计数器变量:int counter=0;

3) 输出如下信息:

“订阅者@”+当前线程名称+“:订阅”+count+“份。”;

4) 通过循环方式开始在循环体内提交指定数量的订阅申请:

其一,若count<=0成立,则输出如下信息并退出循环:

“订阅者@”+当前线程名称+“->完成订阅。”

其二,启动计数器并输出如下信息:

counter++;

“订阅者@”+当前线程名称+“ 在提交第”+counter+“ 份订阅申请。”

其三,把一份订阅信息放入到共享池并更新订阅数量:

pool.produce(media+counter);

count--;

其四,让当前线程休眠半秒钟:

Thread.sleep(500);

2-4. 创建订阅处理业务类:

2-4.1. 在包cn.campsg.java.experiment.entity中创建订阅信息处理者业务类:Consumer;

2-4.2. 为Consumer类定义私有属性:

1) 订阅共享池:SharePool pool;

2-4.3. 为Consumer类创建0参构造器;

2-4.4. 为Consumer类创建1参构造器,其形式如下:

 + 提示

 public Consumer(SharePool  pool) {

}

1) 参数pool为共享池;

2) 在构造器内为对应的属性赋值:

this.pool = pool ;

2-4.5. 为Consumer类实现处理订阅信息的方法,其形式如下:

 提示

 public void run() {

}

本方法的业务实现逻辑如下:

1) 定义订阅信息计数器变量:int counter=0;

2) 通过循环方式开始在循环体内处理共享池内的订阅信息:

其一,启动计数器:counter++;

其二,若counter>15 成立,则输出如下信息并退出循环:

"本线程完成订阅处理量,即刻退出。处理者@"+当前线程名称

其三,若小于15,继续输出如下信息,并调用共享池处理订阅的方法:

"处理者@"+当前线程名+":处理第 "+counter+"份订阅。"

this.pool.consume();

2-5.  模拟现实生产/处理的结果:

2-5.1. 在包cn.campsg.java.experiment中创建业务主类:MainClass;

2-5.2. 在MainClass中定义程序入口主方法:main;

2-5.3. 把以下测试代码粘贴到main方法中:

  + 提示

 public static void main(String[] args) {

SharePool pool = new SharePool();

//模拟批量订阅:开启5个线程订阅,共订阅15份

for(int i=1;i<=5;i++){

new Thread(new Producer(pool,i)).start();

}

//只创建一个消费者线程

new Thread(new Consumer(pool)).start();

}

3、验证与测试

3-1. 在工程中定位主类MainClass。

3-2. 右键点击MainClass类,依次选择:Run As->Java Application。

3-3. 运行程序,查看输出结果是否符合预期

16版.订阅报刊杂志-答案代码(Java)相关推荐

  1. java第二版课后题答案_Java语言程序设计第2版第16章 课后习题答案

    <Java语言程序设计第2版第16章 课后习题答案>由会员分享,可在线阅读,更多相关<Java语言程序设计第2版第16章 课后习题答案(62页珍藏版)>请在人人文库网上搜索. ...

  2. JAVA——附加作业3——订阅报刊杂志

    实验内容: 以读者订阅报刊杂志为背景,体验多线程生产/订阅模式下的经典应用. 具体业务描述: 本实验以实际生活中报刊杂志的订阅为业务背景.订阅者通常有很多种,他们可以 同时向出版社发出订阅申请: 出版 ...

  3. 我的世界java版_我的世界Java版1.16.4-pre2

    我的世界Java版1.16.4-pre2是一款可以让玩家自由发挥自己创造力的像素沙盒类游戏,在这款游戏中玩家就是一片天地的造物主,玩家可以把现实中一切的建筑都完美的复刻在这款游戏里,如此好玩的游戏,玩 ...

  4. CSP:CSP认证考试:202012-1(期末预测之安全指数)满分答案,Java版

    CSP:CSP认证考试:202012-1(期末预测之安全指数)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.Scanner;public class Mai ...

  5. CSP:CSP认证考试:202104-1(灰度直方图)满分答案,Java版

    CSP:CSP认证考试:202104-1(灰度直方图)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.ArrayList; import java.util. ...

  6. CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版

    CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版 一.题目: 二.Java70分答案 import java.util.ArrayList; import java.uti ...

  7. CSP:CSP认证考试:202109-1(数组推导)满分答案,Java版

    CSP:CSP认证考试:202109-1(数组推导)满分答案,Java版 一.题目: 二.Java满分答案 import java.util.ArrayList; import java.util.S ...

  8. [转载] JAVA语言程序设计(基础篇)第十版课后题答案(第一章)

    参考链接: Java中的Scanner和nextChar() JAVA语言程序设计(基础篇)第十版课后题答案 第一章 第二题 /** Created by ysy on 2018/7/6. */ pu ...

  9. Springboot毕设项目报刊杂志订阅系统w457e(java+VUE+Mybatis+Maven+Mysql)

    Springboot毕设项目报刊杂志订阅系统w457e(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HB ...

  10. java课设答案清华大学出版_java程序设计习题答案(清华大学出版杜)张思民版_1-12章答案全.doc...

    java程序设计习题答案(清华大学出版杜)张思民版_1-12章答案全.doc 还剩 104页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载 ...

最新文章

  1. Javascript字符串及数组赋值区别
  2. ubuntu 挂载新硬盘
  3. 机器学习导论(张志华):EM收敛性原理
  4. anaconda tensorflow 2.3_2020款福特撼路者将于7月17日上市 动力升级/搭载2.3T+10AT
  5. C语言 | 使用牛顿法求非线性方程的一个实根(附代码)
  6. Native Application 开发详解
  7. 用MS SQL Reporting Services生成报表
  8. Server 2003 终端超过了最大允许连接数解决
  9. Linux中 /proc/[pid] 目录各文件简析
  10. python标准正态分布表(scipy.stats)
  11. xshell添加vbs脚本
  12. 驱动人生安装驱动计算机无法启动,驱动人生解决声卡驱动问题 驱动人生针对电脑不出声解决方案...
  13. axios封装全局loading
  14. 对照ArcGIS坐标系统文件(.prj)用Deskpro完成投影转换
  15. 微信公众号文章是HTML吗,醒醒吧!你看的微信文章都不是自己写的,内容全靠搬!...
  16. HDU 1867 A + B for you again(KMP)
  17. web端调用高德API
  18. 企业为什么需要BI报表工具?
  19. 【++运算符重载】c++实现递增运算符重载
  20. echarts X轴文字竖向排列 ,一行两字竖向排列或旋转角度排列

热门文章

  1. ATTCK实战系列——红队实战(二)
  2. JS 把 Wed Jul 15 2015 00:00:00 GMT+0800 转换成2015-07-15
  3. 美通社企业新闻汇总 | 2019.1.17 | 骊住在上海成立亚洲研发中心,霍尼韦尔深入参与中国最大石化项目建设...
  4. 索爱最强大java手机_这几款索爱的手机哪款好啊?
  5. IT数学逻辑之正余弦定理指正弦定理和余弦定理
  6. 披萨门 pizzagate
  7. 融云CTO杨攀:以技术为先导 全面聚焦“互联网通信云”
  8. 《墨菲定律》读书笔记之第一章——成功学的秘密
  9. cat3 utp是不是网线_五类100对屏蔽双绞线UTPCAT3
  10. mib浏览器_大众汽车的第二代MIB信息娱乐系统图解