黑马程序员_银行业务调度系统

本文介绍了一个银行业务调度系统的实现,包括客户(普通、快速、VIP)、号码管理、窗口服务(普通、快速、VIP)等核心组件。通过多线程模拟窗口服务流程,随机生成服务时间,实现不同类型的客户服务。同时,系统使用单例模式和枚举来管理号码和客户类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------------- android培训java培训、java博客、java学习型技术博客、期待与您交流! -------------
需求(略) 思路 1、需求简述 客户拿号等着办理业务,业务窗口叫号为客户办理业务 2、名次提炼找对象 客户、号码、窗口、业务(隐性) 3、简析对象 客户:普通、快速、vip三种类型客户,可用枚举表示,不同客户有不同服务号码 号码:三种客户需要分别服务,因而有三种号码,每个号码对应一个客户且按先后排序,      客户拿号和窗口叫号对应号码对象则提供两种方法 窗口:普通、快速、vip三种类型窗口,不同类型窗口服务方式不一样,但都是按获取的号码依次提供服务 业务:无需体现具体业务,可用随机方式设置办理业务时间 4、对象关联 客户-->明确服务类型-->获取该服务类型号码-->等待窗口叫号服务 (明确类型,银行是通过一台机器客户在上面选择的方式完成) 5、类的创建 号码管理 属性:下一个需要服务号码、装号码的集合 行为:为客户产生新号码方法、无窗口提供下一个服务号码 客户 普通、快速、vip三种实例对象 不同类型号码管理 属性:普通、快速、vip三种类型号码管理 行为:仅一个对象来明确需那种类型、三种生成号码管理的方法 窗口 属性:窗口类型、窗口编号 方法:开始服务的方法,三种服务方法 主函数类 创建1、2、3、4号普通窗口,5号快速窗口,6号vip窗口 创建3个线程分别来模拟生成三种客户且取相应的服务号码 另定义一个常量类来装程序所需的常量
package cn.ithema.interview.bank1;

import java.util.ArrayList;
import java.util.List;
public class NumberManager {
	//定义下一个所需服务号码
	private int lastNumber=1;
	//定义一个装号码的有序集合
	private List<Integer> queueNumber = new ArrayList<Integer>();
	
	//定义为客户生产新号码的方法
	public synchronized Integer generateNewNumber(){
		queueNumber.add(lastNumber);
		return lastNumber++;
	}
	//定义一个为窗口获取服务号码的方法,
	//因为取号叫号为多个线程控制,所以使用同步函数
	public synchronized Integer fetchNumber(){
		if(queueNumber.size()>0)
			return queueNumber.remove(0);
		return null;
	}
}
package cn.ithema.interview.bank1;
public class NumberMachine {
	//单例设计
	private static final NumberMachine instance = new NumberMachine();
	private NumberMachine(){}
	public static NumberMachine getInstance(){
		return instance;
	}
	//初始化三种号码管理
	private NumberManager commonManager = new NumberManager();
	private NumberManager expressManager = new NumberManager();
	private NumberManager vipManager = new NumberManager();
	//为客户提供选择取什么号码的号码管理器
	public NumberManager getCommonManager(){
		return commonManager;
	}
	public NumberManager getExpressManager(){
		return expressManager;
	}
	public NumberManager getVipManager(){
		return vipManager;
	}
}
package cn.ithema.interview.bank1;
public enum ClientType {
	COMMON,EXPRESS,VIP;
	public String toString() {
		switch(this){
		case COMMON:
			return "普通";
		case EXPRESS:
			return "快速";
		case VIP:
			return "vip";
		}
		return null;
	}
}
package cn.ithema.interview.bank1;
public class Constants {
	public static final int MAX_SERVICE_TIME = 10000;
	public static final int MIN_SERVICE_TIME = 1000;
	public static final int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}
package cn.ithema.interview.bank1;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
	//定义窗口服务客户类型和窗口编号,并创建其set和get方法
	private int id;
	private ClientType type;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public ClientType getType() {
		return type;
	}
	public void setType(ClientType type) {
		this.type = type;
	}
	//定义窗口启动服务方法,需要多线程循环执行
	public void start(){
		Executors.newSingleThreadExecutor().execute(
			new Runnable(){
				public void run() {
					while(true){
						switch(type){
						case COMMON:
							commonService();
							break;
						case EXPRESS:
							expressService();
							break;
						case VIP:
							vipService();
							break;
						}
					}
				}
			});
	}
	//为三种不同客户创建三种服务方法
	public void commonService(){
		//定义一个窗口名字
		String windowName = "<"+id+"号"+type+"窗口"+">";
		//获取服务号码
		Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber();
		//若号码有值则服务,若号码无值,则等待1s
		if(serviceNumber!=null){
			System.out.println(windowName+"开始获取普通客户服务任务");
			//随机产生服务时间,通过sleep方法实现服务时间
			int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
			int serviceTime = new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("*"+windowName+"已完成对第"+ serviceNumber +
					"号普通客户服务,总共用时:"+ serviceTime/1000 +"秒");
		}else{
			System.out.println(windowName+"没有需要服务的普通客户,等待1s后再发起服务");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	public void expressService(){
		String windowName = "<"+id+"号"+type+"窗口"+">";
		Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber();
		//若号码有值则服务,若号码无值,则服务普通客户
		if(serviceNumber!=null){
			System.out.println(windowName+"开始获取快速客户服务任务");
			//服务时间为最短时间,通过sleep方法实现服务时间
			int serviceTime = Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("*"+windowName+"已完成对第"+ serviceNumber +
					"号快速客户服务,总共用时:"+ serviceTime/1000 +"秒");
		}else{
			System.out.println(windowName+"没有需要服务的快速客户");
			commonService();
		}
	}
	public void vipService(){
		String windowName = "<"+id+"号"+type+"窗口"+">";
		Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber();
		//若号码有值则服务,若号码无值,则服务普通客户
		if(serviceNumber!=null){
			System.out.println(windowName+"开始获取vip客户服务任务");
			int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
			int serviceTime = new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("*"+windowName+"已完成对第"+ serviceNumber +
					"号vip客户服务,总共用时:"+ serviceTime/1000 +"秒");
		}else{
			System.out.println(windowName+"没有需要服务的vip客户");
			commonService();
		}
	}
}
package cn.ithema.interview.bank1;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MainClass {
	public static void main(String[] args) {
		//1、2、3、4号普通窗口,5号快速窗口,6号vip窗口,并调用start方法
		for(int i=1;i<5;i++){
			ServiceWindow commonWindow = new ServiceWindow();
			commonWindow.setId(i);
			commonWindow.setType(ClientType.COMMON);
			commonWindow.start();
		}
		ServiceWindow expressWindow = new ServiceWindow();
		expressWindow.setId(1);
		expressWindow.setType(ClientType.EXPRESS);
		expressWindow.start();
		
		ServiceWindow vipWindow = new ServiceWindow();
		vipWindow.setId(6);
		vipWindow.setType(ClientType.VIP);
		vipWindow.start();
		
		//创建三个定时器,通过定期由NumberMachine按类型拿号来模拟客户拿号
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
			new Runnable(){
				public void run() {
					Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewNumber();
					System.out.println("第"+serviceNumber+"号普通客户正在等待服务");
				}
			}, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME, TimeUnit.SECONDS);
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable(){
					public void run() {
						Integer serviceNumber = NumberMachine.getInstance().getExpressManager().generateNewNumber();
						System.out.println("第"+serviceNumber+"号快速客户正在等待服务");
					}
				}, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME*2, TimeUnit.SECONDS);
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable(){
					public void run() {
						Integer serviceNumber = NumberMachine.getInstance().getVipManager().generateNewNumber();
						System.out.println("第"+serviceNumber+"号vip客户正在等待服务");
					}
				}, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME*6, TimeUnit.SECONDS);
	}
}






------------- android培训java培训、java博客、java学习型技术博客、期待与您交流! -------------
详情请查看:http://edu.youkuaiyun.com/heima/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值