黑马程序员 银行调度系统

-----------android培训java培训、java学习型技术博客、期待与您交流! -----------

银行业务调度系统:

模拟实现银行业务调度系统:
1,有6个业务窗口,4个普通窗口,1个快速窗口,1个VIP窗口。
客户比例对应为:6:3:1其中当快速窗口或VIP窗口空闲时,可以办理普通业务。
2,客户办理业务所需时间是随机的,有最大和最小值。快速客户办理用时为最小值。
3,客户每隔1秒产生。


思路:
根据现实生活的情况
1,客户通过取号机获取对应业务的号码。取号机是唯一的。
2,银行窗口通过叫号的形式为客户提供服务。

1,定义一个类产生号码

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 generateNewManager()
	{
		queueNumber.add(lastNumber);
		return lastNumber++;
	}
	//定义函数,银行窗口获取号码,从集合中取出。
	public synchronized Integer fetchServiceNumber()
	{
		Integer number = null;
		if(queueNumber.size()>0)
			number =  queueNumber.remove(0);
		return number;
	}
}

2,定义一个取号机,根据客户不同的业务需求,产生不同类型的号码。

public class NumberMachine
{	//用来产生普通客户的号
	private NumberManager commonManager = new NumberManager();
	//用来产生快速客户的号
	private NumberManager expressManager = new NumberManager();
	//用来产生VIP客户的号
	private NumberManager vipManager = new NumberManager();
	public NumberManager getCommonManager() {
		return commonManager;
	}
	public NumberManager getExpressManager() {
		return expressManager;
	}
	public NumberManager getVipManager() {
		return vipManager;
	}
	//因为机器唯一,用单例模式产生。
	private NumberMachine(){};
	private static NumberMachine n = new NumberMachine();
	public static NumberMachine getInstance()
	{
		return n;
	}	
}

3,用枚举定义用户类型

public enum CustomerType
{
	COMMON,EXPRESS,VIP;
	//将类型用中文表示。
	public String toString()
	{
		switch(this){
		case COMMON:
			return "普通";
		case EXPRESS:
			return "快速";
		case VIP:
			return name();
		}
		return "";
	}
}

4,定义一个类装需要用到的常量。

public class Constants
{
	public static int MAX_SERVICE_TIME = 10000;
	public static int MIN_SERVICE_TIME = 1000;
	public static int COMMON_CUSTOMER_INTERVAL_TIME =1;
}

5,定义银行窗口,取号服务。

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ServiceWindow
{	//初始服务窗口为普通类型,窗口号为1.
	private CustomerType type = CustomerType.COMMON;
	private int windowId = 1;
	//设置窗口类型
	public void setType(CustomerType type) {
		this.type = type;
	}
	//设置窗口号码
	public void setWindowId(int windowId) {
		this.windowId = windowId;
	}
	//窗口为客户服务
	public void start()
	{	//用线程池产生一个线程运行服务
		ExecutorService thread = Executors.newSingleThreadExecutor();
		thread.execute(new Runnable()
		{
			public void run()
			{
				while(true)
				{	//判断客户类型,使对应的窗口进行服务。
					switch(type)
					{
						case COMMON:
							commonService();
							break;
						case EXPRESS:
							expressService();
							break;
						case VIP:
							vipService();
							break;
					}
				}
			}
		});				
	}
	//对普通客户的服务
	private void commonService()
	{	
		String windowName = "第"+windowId+"号"+type+"窗口";
		System.out.println(windowName+"正在取号");
		//获取普通窗口的客户号码
		Integer num = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
		if(num != null)
		{
			System.out.println(windowName+"正在为第"+num+"号普通客户服务");
			//随机服务1到10秒
			long beginTime = System.currentTimeMillis();
			int serveTime = new Random().nextInt(Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME)+1+Constants.MIN_SERVICE_TIME;
			try
			{
				Thread.sleep(serveTime);
			} 
			catch (InterruptedException e) 
			{
				e.printStackTrace();
			}
			long costTime = System.currentTimeMillis()-beginTime;
			System.out.println(windowName+"为第"+num+"号"+"普通客户服务完毕"+"耗时"+costTime/1000+"秒");
		}
		else
		{
			System.out.println(windowName+"没有取到服务任务,休息1秒钟。");
			try 
			{
				Thread.sleep(1000);
			} 
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
	}
	//对快速客户的服务
	private void expressService() 
	{
		String windowName = "第"+windowId+"号"+type+"窗口";
		System.out.println(windowName+"正在取号");
		//获取快速客户的号码
		Integer num = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
		if(num != null)
		{
			System.out.println(windowName+"正在为第"+num+"号"+type+"客户服务");
			//快速服务的时间为固定的1秒
			long costTime = Constants.MIN_SERVICE_TIME;
			System.out.println(windowName+"为第"+num+"号"+type+"客户服务完毕"+"耗时"+costTime/1000+"秒");
		}
		else
		{
			System.out.println(windowName+"没有取到服务任务,正在获取普通客户。");
			//当该窗口空闲时,协助普通窗口办理业务。
			commonService();
			try  
			{
				Thread.sleep(1000);
			}
			catch (InterruptedException e) 
			{
				e.printStackTrace();
			}
		}
	}
	//对VIP客户的服务
	private void vipService()
	{
		String windowName = "第"+windowId+"号"+type+"窗口";
		System.out.println(windowName+"正在取号");
		//获取VIP客户的号码
		Integer num = NumberMachine.getInstance().getVipManager().fetchServiceNumber();
		if(num != null)
		{
			System.out.println(windowName+"正在为第"+num+"号"+type+"客户服务");
			//随机指定服务时间
			long beginTime = System.currentTimeMillis();
			int serveTime = new Random().nextInt(Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME)+1+Constants.MIN_SERVICE_TIME;
			try  
			{
				Thread.sleep(serveTime);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			long costTime = System.currentTimeMillis()-beginTime;
			System.out.println(windowName+"为第"+num+"号"+type+"客户服务完毕"+"耗时"+costTime/1000+"秒");
		}
		else
		{
			System.out.println(windowName+"没有取到服务任务,正在获取普通客户。");
			commonService();
			try  
			{
				Thread.sleep(1000);
			} 
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
	}
}


6,定义一个主类,对以上元素进行整合。
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MainClass 
{
	public static void main(String[] args)
	{	//产生4个普通窗口,进行服务
		for(int x =1;x<5;x++)
		{
			ServiceWindow commonWindow = new ServiceWindow();
			commonWindow.setWindowId(x);
			commonWindow.start();
		}
		//创建一个快速窗口,进行服务
		ServiceWindow expressWindow = new ServiceWindow();
		expressWindow.setType(CustomerType.EXPRESS);
		expressWindow.start();
		//创建一个VIP窗口,进行服务
		ServiceWindow vipWindow = new ServiceWindow();
		vipWindow.setType(CustomerType.VIP);
		vipWindow.start();
		//通过定时器,每隔1秒产生一个普通客户
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable()
				{
					public void run(){
						Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();
						System.out.println("第"+number+"号普通客户正在等待服务");
					}
				}, 
				0, 
				Constants.COMMON_CUSTOMER_INTERVAL_TIME, 
				TimeUnit.SECONDS);
		//通过定时器,每隔2秒产生一个快速客户
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable(){
					public void run(){
						Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();
						System.out.println("第"+number+"号快速客户正在等待服务");
					}
				}, 
				0, 
				Constants.COMMON_CUSTOMER_INTERVAL_TIME*2, 
				TimeUnit.SECONDS);
		//通过定时器,每隔6秒产生一个VIP客户
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable(){
					public void run(){
						Integer number = NumberMachine.getInstance().getVipManager().generateNewManager();
						System.out.println("第"+number+"号vip客户正在等待服务");
					}
				}, 
				0
				, 
				Constants.COMMON_CUSTOMER_INTERVAL_TIME*6, 
				TimeUnit.SECONDS);
	}
}

-----------android培训java培训、java学习型技术博客、期待与您交流! -----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值