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

实验内容
以读者订阅报刊杂志为背景,体验多线程生产/订阅模式下的经典应用。
具体业务描述
本实验以实际生活中报刊杂志的订阅为业务背景。订阅者通常有很多种,他们可以
同时向出版社发出订阅申请; 出版社通常根据自身的资源条件对收到的订阅申请做统
一的处理;出版社通常能接受并处理的订阅申请量是有一定限度的;出版社汇总订阅申
请信息后交由独立业务单元处理,直至完毕;本业务主要是模拟多读者同时订阅、信息
汇总后再行处理的业务情景。
本实验的关键业务概念:
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();
				}
			}
		}
	}
}

截图
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 报刊订阅管理系统是一个用于管理报刊订阅信息的系统,采用Java编写可以提供灵活且高效的功能。 首先,这个系统将包括一个用户界面,用户可以通过界面进行订阅、取消订阅等操作。用户可以浏览系统中提供的不同报刊选项,并选择自己感兴趣的报刊进行订阅。同时,用户还可以查看自己已经订阅的报刊列表,并进行相应的管理操作。 其次,系统将提供管理员界面,管理员可以对报刊进行管理。管理员可以添加新的报刊信息,包括报刊名称、价格、发行周期等。管理员还可以根据需要编辑已有报刊的信息,以及删除不再提供的报刊。 此外,系统还将包括一个数据库,用于存储订阅信息、报刊信息等数据。系统通过与数据库进行交互,实现对订阅信息的增删改查等操作。数据库的设计要考虑到数据的完整性和一致性,以及性能的优化。 另外,系统还应该实现一些额外的功能,例如提供报刊推荐功能,根据用户的兴趣或订阅历史推荐相似的报刊给用户。还可以提供报刊收藏功能,用户可以将自己喜欢的报刊加入到收藏夹中方便查看。 总的来说,报刊订阅管理系统的Java编写将会实现用户的订阅与管理功能,提供管理员对报刊的管理,通过数据库和一些额外的功能提高用户的体验。这个系统的设计和开发需要考虑到用户需求和系统的可扩展性,以便于未来的维护和升级。 ### 回答2: 报刊订阅管理系统是一款使用Java编写的系统,旨在帮助报刊社或订阅者进行报刊订阅管理。系统具有以下功能: 1. 报刊管理:系统可以记录报刊的基本信息,包括报刊名称、出版社、出版日期等,并可添加新的报刊信息或对已有报刊进行修改和删除。 2. 订阅管理:系统可以记录订阅者的信息,包括姓名、联系方式、订阅的报刊等,并可添加新的订阅者信息或对已有订阅者进行修改和删除。 3. 订阅查询:订阅者可以通过系统查询自己订阅的报刊信息,包括订阅开始日期、截止日期等。 4. 缴费管理:订阅者可以通过系统进行报刊订阅费用的缴纳,并可查询自己的缴费记录。 5. 报刊推荐:系统可以根据订阅者的兴趣和订阅历史,推荐与之相关的其他报刊,增加订阅者的选择性。 6. 管理员权限:系统拥有管理员账号,管理员可以对报刊和订阅者信息进行修改和删除,以及查看系统的整体情况。 7. 数据备份与恢复:系统可以定期进行数据备份,以防止数据丢失或损坏,并可根据需要进行数据恢复操作。 通过这个报刊订阅管理系统,报刊社可以更好地管理和与订阅者进行沟通,订阅者也能方便地查询和管理自己的订阅情况。系统以Java为开发语言,可以运行于多个平台上,具有良好的稳定性和可扩展性,为报刊社和订阅者提供便捷、高效的服务。 ### 回答3: 报刊订阅管理系统是一个用于管理报刊订阅信息的应用程序,它使用Java编写。该系统为报刊社和订户提供了便捷的功能,使得管理订阅信息和订阅流程更加高效和方便。 该系统具有以下功能: 1. 报刊管理:管理员可以添加、删除和修改报刊信息,包括报刊名称、价格、出版周期等。管理员还可以查看当前所有报刊的订阅情况。 2. 订户管理:管理员可以添加、删除和修改订户信息,包括订户姓名、邮寄地址、联系方式等。管理员还可以查询所有订户的订阅情况。 3. 订阅管理:订户可以通过该系统进行报刊订阅。订户可以浏览所有的报刊列表,选择感兴趣的报刊进行订阅,并选择订阅的时长和数量。系统会自动计算订阅费用,并提供支付功能。 4. 订阅查询:订户可以随时查询自己的订阅情况,包括已订阅报刊的详情、订阅时长、剩余期数等信息。 5. 统计报表:系统提供各种统计报表,包括订户数量、报刊订阅量以及销售收入等信息。管理员可以根据这些报表做出决策和分析。 编写该系统需要使用Java编程语言,Java具有丰富的类库和框架,能够方便地实现系统所需的各种功能。使用Java编写的系统还具有良好的可维护性和扩展性。 在实现该系统时,可以使用Java的面向对象编程思想,将报刊、订户和订阅等概念抽象为类,并建立相应的数据模型。通过面向对象的方式设计系统,能够更好地区分系统的各个模块,降低代码的耦合度和提高系统的可维护性。 此外,为了提高系统的用户体验,可以使用Java的Swing或JavaFX等图形界面库来设计系统的用户界面,使界面美观且易于使用。 总之,报刊订阅管理系统的Java编写能够有效地实现报刊的管理和订阅功能,提高报刊社和订户的工作效率和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值