实验内容
以读者订阅报刊杂志为背景,体验多线程生产/订阅模式下的经典应用。
具体业务描述
本实验以实际生活中报刊杂志的订阅为业务背景。订阅者通常有很多种,他们可以
同时向出版社发出订阅申请; 出版社通常根据自身的资源条件对收到的订阅申请做统
一的处理;出版社通常能接受并处理的订阅申请量是有一定限度的;出版社汇总订阅申
请信息后交由独立业务单元处理,直至完毕;本业务主要是模拟多读者同时订阅、信息
汇总后再行处理的业务情景。
本实验的关键业务概念:
1) 订阅者,即订阅信息生产者,向共享池中放入订阅信息;
2) 信息汇总,即订阅信息共享池,生产者和消费者共用;
3) 业务单元,即订阅信息消费者,处理订阅者生产的订阅信息。
创建工程并配置环境
1) 工程名:SE_JAVA_EXP_E03。
2) 创建包,取名:cn.com.java.experiment 和 cn.com.java.experiment.entity。
3) 在 包 cn.com.java.experiment.entity 下 创建订阅信息共享池业务类:SharePool。

  • 设置两个属性,只为 pool 属性实现 setter/getter 方法;

  • 为 SharePool 类创建构造器,初始化最大限量的订阅信息;

  • 创建生成订阅信息的方法 produce,由订阅者调用,生成订阅信息并完成订阅信息的提交,实现要求如下:
    1.应用同步机制控制本方法的实现;
    2.获取当前订阅信息共享池的信息数量;
    3.当共享池信息数量等于最大订阅量时,输出如下信息并开始等待:“订阅请求队列已满,等待系统处理订阅请求中……”
    4.当共享池信息数量小于最大订阅量时:把订阅信息加入到共享池;在控制台输出如下格式的信息:“订阅者@”+当前线程名+":订阅《" + media + “》申请已提交.当前订阅数量为:” + 订阅数量;发出完成订阅申请的通知。

  • 创建处理订阅信息的方法 consum,由订阅信息消费者调用,完成订阅信
    息的处理。实现要求如下:
    1…应用同步机制控制本方法的实现;
    2.获取当前订阅信息共享池的信息数量;
    3.当共享池信息数量等于 0 时,输出如下信息并开始等待:“处理者@” +当前线程名称+“暂无订阅请求信息,等待中……”
    4.当共享池信息数量不为 0 时:从订阅共享池移除一项订阅信息;在控制台输出如下格式的信息:“处理者@”+当前线程名+":处理《" + 移除订阅信息 + “》订阅已完毕。尚待处理订阅数量为:” + 剩余订阅数量;发出完成订阅处理的通知。

4) 在 cn.com.java.experiment.entity 包中创建订阅信息生产者业务类:Producer

  • Producer 类需要实现线程类接口 Runnable,并且实现 run 方法;

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

  • 为 Producer 类创建构造器;

  • 为 Producer 类实现生产订阅信息的 run 方法,以产生指定数量订阅信息并
    存放到订阅共享池中。实现要求如下:
    1.模拟输出订阅者相关信息,格式如下: “订阅者@”+当前线程名称+“:订阅”+订阅数量+“份。”;
    2.通过循环方式发出所有指定数量的订阅请求:当订阅数量发送完毕后,结束订阅并输出如下信息: “订阅者@”+当前线程名称+“->完成订阅。”定义计数器,把信息放入到订阅信息共享池并输出如下信息:“订阅者@”+当前线程名称+“ 在提交第”+计数器+“ 份订阅申请。”让当前线程休眠半秒钟;订阅完毕后退出方法。

5) 在 cn.com.java.experiment.entity 包中创建订阅信息处理者业务类:Consumer

  • Consumer 类需要实现线程类接口 Runnable,并且实现 run 方法;

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

  • 为 Consumer 类创建构造器;

  • 为 Consumer 类实现生产订阅信息的 run 方法,产生指定数量的订阅信息并存放到订阅信息共享池中。实现要求如下:
    1.创建处理订阅信息数量的计数器;
    2.通过循环方式处理共享池内的所有订阅信息:启动计数器,当计数器大于15 时,结束处理并输出如下信息:“本线程完成订阅处理量,即刻退出。处理者@”+当前线程名称;当计数器小于 15 时,处理共享池内的订阅信息并输出如下信息:“订阅者@”+当前线程名称+“ :处理第”+计数器+“ 份订阅。”处理全部完成后,退出信息订阅池。

6) 在包 cn.com.java.experiment 下创建主类:MainClass,模拟现实生产/处理的结
果。

  1. 为 MainClass 创建入口主方法:main;
  2. 在 main 中,创建 1 个订阅信息共享池对象;
  3. 在 main 中,创建 5 个不同的订阅者,订阅总量为 15,共用共享池;
  4. main 中,创建 1 个订阅处理类对象,处理所有提交的订阅信息。

代码
Mainclass

package cn.com.java.experiment;import cn.com.java.experiment.entity.Consumer;
import cn.com.java.experiment.entity.Producer;
import cn.com.java.experiment.entity.SharePool;public class MainClass {public static void main(String[] args) {SharePool pool = new SharePool();for (int i = 1; i <= 5; i++) {new Thread(new Producer(pool, i)).start();}new Thread(new Consumer(pool)).start();}
}

Consumer

package cn.com.java.experiment.entity;public class Consumer implements Runnable {private SharePool pool;public Consumer() {super();}public Consumer(SharePool pool) {super();this.pool = pool;}public void run() {int counts = 1;while(true){if(counts <= 15) {System.out.println("处理者@" + Thread.currentThread().getName() + ":处理第" + counts + "份订阅。");this.pool.consume();}else{System.out.println("本线程完成订阅处理量,即刻退出。处理者@" + Thread.currentThread().getName());break;}counts++;}}
}

Producer

package cn.com.java.experiment.entity;public class Producer implements Runnable {private SharePool pool; private int count; public Producer() {super();}public Producer(SharePool pool, int count) {super();this.pool = pool;this.count = count;}public void run() {String infor = "报刊杂志";int counts = 0;System.out.println("订阅者@" + Thread.currentThread().getName() + ":订阅" + count + "份。");while (count > 0) {counts++;System.out.println("订阅者@" + Thread.currentThread().getName() + " 在提交第" + counts + " 份订阅申请。");pool.produce(infor + counts);count--;try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("订阅者@" + Thread.currentThread().getName() + "->完成订阅。");}
}

Sharepool

package cn.com.java.experiment.entity;import java.util.ArrayList;
import java.util.List;public class SharePool {private List<String> pool=new ArrayList(); private final int MAX=15; public List<String> getPool(){return pool;}public void setPool(List<String> pool) {this.pool = pool;}public SharePool() {super();}public void produce(String infor) {synchronized (this) {if (pool.size() == MAX) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("订阅请求队列已满,等待系统处理订阅请求中......");}else {pool.add(infor);System.out.println("订阅者@" + Thread.currentThread().getName() + ":订阅《" + infor + "》申请已提交.当前订阅数量为:" + pool.size());try{notify();}catch(Exception e ) {e.printStackTrace();}}}}public void consume() {synchronized (this) {if (pool.size() == 0) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("处理者@" + Thread.currentThread().getName() + "暂无订阅请求信息,等待中......");}else {String infor = pool.remove(0);System.out.println("处理者@" + Thread.currentThread().getName() + ":处理《" + infor + "》订阅已完毕。尚待处理订阅数量为:" + pool.size());try{notify();}catch(Exception e) {e.printStackTrace();}}}}
}

截图

JAVA——附加作业3——订阅报刊杂志相关推荐

  1. JAVA——附加作业2——情人节送花

    实验内容:本实验以情人节送花为业务背景,女方提出送花需求,男方送出鲜花, 体验自定义异常以及异常处理机制.当女方提出送花数超过男方可承受范围(例如: 100 朵)时,需要抛出异常. 创建工程并配置环境 ...

  2. JAVA——附加作业1——统计员工数

    实验内容:通过给定的员工列表,显示工号不重复的员工信息. 创建工程并配置环境: 1)工程名:SE_JAVA_EXP_E01. 2)创建包,取名:cn.com.java.experiment. 3)在包 ...

  3. JAVA——附加作业4——体重指数计算器

    做一个窗体应用程序"体重指数计算器",能根据用户输入的性别.身高.体重计算出"体质指数(身体质量指数)",并给出是否偏胖的判断.其中,体质指数(BMI) =体重 ...

  4. hadoop_单元测试Java Hadoop作业

    hadoop 在我以前的文章中,我展示了如何设置一个完整的基于Maven的项目,以用Java创建Hadoop作业. 当然并没有完成,因为它缺少单元测试部分. 在这篇文章中,我将展示如何将MapRedu ...

  5. 20181127-1附加作业 软件工程原则的应用实例

    20181127-1附加作业 软件工程原则的应用实例 此作业的要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2446] 在软件 ...

  6. python编程书籍1020python编程书籍_代写INFT 1020作业、Database作业代做、Java课程作业代写、c++,Python编程作业代做...

    代写INFT 1020作业.Database作业代做.Java课程作业代写.c++,Python编程作业代做 日期:2020-04-25 10:27 INFT 1020 Database Fundam ...

  7. Java web对试卷进行单选多选答题进行打分_2020年大学慕课Java程序设计作业答案...

    2020年大学慕课Java程序设计作业答案 更多相关问题 [单选] 单元测试内容不包括().[单选] 在一个列车控制软件的需求文档中,我们发现了以下两条需求描述:"列车车门在两个停靠站之间要 ...

  8. java hadoop_单元测试Java Hadoop作业

    java hadoop 在我以前的文章中,我展示了如何设置一个完整的基于Maven的项目,以用Java创建Hadoop作业. 当然并没有完成,因为它缺少单元测试部分. 在这篇文章中,我将展示如何将Ma ...

  9. 单元测试Java Hadoop作业

    在我以前的文章中,我展示了如何设置一个完整的基于Maven的项目,以用Java创建Hadoop作业. 当然并没有完成,因为它缺少单元测试部分. 在本文中,我将展示如何将MapReduce单元测试添加到 ...

最新文章

  1. IEEE分享 | 机器学习在领英的规模化应用
  2. 译C#使用设计模式和软件设计原则构建应用程序 PartIII
  3. vue 动态设置页面title
  4. mvc4中的 webapi 的使用方式
  5. Ajax框架DWR入门
  6. 设计模式---命令模式
  7. mysql删除表中数据报错:[Err] 1206 - The total number of locks exceeds the lock table size
  8. 人工智能秘史(二):美国第一台计算机背后的女程序员
  9. 4.16_template_method_行为型模式:模板方法模式
  10. jmeter 参数化
  11. SpringSecurity安全框架的笔记
  12. new 关键字做的事
  13. python如何上传文件_python请求文件上传
  14. JQuery 学习总结及实例 !! (转载)
  15. 利用大智慧DDE数据生成每只股票的历史数据文件(SQLServer2005)
  16. ios 开发控件中心点_AppCan
  17. 前端培训丁鹿学堂:css伪类选择器(一)
  18. JavaFX入门(一):我的第一个JavaFX程序
  19. 人才流失不断,苹果 M1 芯片首席设计师重回老东家——英特尔
  20. SAP供应商 供货方和开票方不一致的强控

热门文章

  1. 前端动画 wow.js 效果
  2. 如何获取codeforces的完整数据
  3. Divide and conquer:Dropping tests(POJ 2976)
  4. C++中的数组与指针
  5. WPF: 使用CommandManager.InvalidateRequerySuggested手动更新Command状态
  6. GeoPoint与LocationData
  7. tomcat日志,用户以及启动时的一些问题
  8. zoj1738 Lagrange's Four-Square Theorem(DP)
  9. 关于idea的git账号与电脑的git账号不一致的问题。已解决!
  10. xp做打印服务器 找不到驱动,XP系统安装打印机驱动提示找不到指定的模块怎么办...