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

---------------------------------------- JavaEE+云物联、期待与您交流!---------------------------------------------

<pre name="code" class="java">/**
 *银行业务调度系统,主要分为三个部分:
 *1,第一部分是取号模组,包括一个取号机和三个号码管理模块。
 *2,第二部分是服务模组,包括服务类型模块、时间模块、服务分配模块。
 *3,第三部分是启动模组,用于启动服务模组和取号模组。
 */

import java.util.*;
import java.util.concurrent.*;

//启动模块,用于启动服务窗口和号码机。
public class Bank
{
	public static void main(String[] args)
	{
		for(int i=1;i<5;i++)
		{
			ServiceWindow commonWindow = new ServiceWindow();
			commonWindow.setServiceWindow(CustomerType.COMMON,i);
			commonWindow.start();
		}

		ServiceWindow expressWindow = new ServiceWindow();
		expressWindow.setServiceWindow(CustomerType.EXPRESS,1);
		expressWindow.start();

		ServiceWindow vipWindow = new ServiceWindow();
		vipWindow.setServiceWindow(CustomerType.VIP,1);
		vipWindow.start();

		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
			new Runnable(){
				public void run()
				{
					int number = NumberMachine.getInstance()
						.getCommonManager().generateServiceNumber();

					System.out.println("第"+number
						+"位申请普通服务的顾客正在等待。");
				}
			},
			0,
			ServiceTime.CUSTOMER_APPLY_FOR_TIME,
			TimeUnit.SECONDS
		);

		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
			new Runnable(){
				public void run()
				{
					int number = NumberMachine.getInstance()
						.getExpressManager().generateServiceNumber();

					System.out.println("第"+number
						+"位申请快速服务的顾客正在等待。");
				}
			},
			0,
			ServiceTime.CUSTOMER_APPLY_FOR_TIME*2,
			TimeUnit.SECONDS
		);

		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
			new Runnable(){
				public void run()
				{
					int number = NumberMachine.getInstance()
						.getVipManager().generateServiceNumber();

					System.out.println("第"+number
						+"位申请VIP服务的顾客正在等待。");
				}
			},
			0,
			ServiceTime.CUSTOMER_APPLY_FOR_TIME*6,
			TimeUnit.SECONDS
		);
	}
}

//号码生成模块,用于获取、保存、分配号码。
class NumberManager
{
	private List<Integer> queueNumber = new ArrayList<Integer>();
	private int lastNumber = 1;

	public synchronized int generateServiceNumber()
	{
		queueNumber.add(lastNumber);
		return lastNumber++;
	}

	public synchronized Integer fetchServiceNumber()
	{
		Integer currentNumber = null;
		if(queueNumber.size()>0)
			currentNumber = queueNumber.remove(0);
		return currentNumber;
	}
}

//号码机,用于管理三个号码生成模块。
class NumberMachine
{
	private static 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;
	}
}

//服务类型模块,用于定义服务窗口的类型。
enum CustomerType
{
	COMMON,EXPRESS,VIP;

	public String toString()
	{
		switch(this)
		{
			case COMMON:
				return "普通服务";
			case EXPRESS:
				return "快速服务";
			case VIP:
				return name()+"服务";
		}
		return null;
	}
}

//时间模块,用于定义一些时间。
class ServiceTime
{
	public static final int MIN_SERVICE_TIME = 1000;
	public static final int MAX_SERVICE_TIME = 10000;
	public static final int CUSTOMER_APPLY_FOR_TIME = 1;

	public static int fecthServiceTime(CustomerType customerType)
	{
		switch (customerType)
		{
			case COMMON:
				return new Random().nextInt(MAX_SERVICE_TIME-MIN_SERVICE_TIME)
						+1+MIN_SERVICE_TIME;
			case EXPRESS:
				return MIN_SERVICE_TIME;
			case VIP:
				return new Random().nextInt(MAX_SERVICE_TIME-MIN_SERVICE_TIME)
					+1+MIN_SERVICE_TIME;
		}
		return 0;
	}
}

//服务窗口模块,用于提供本窗口的服务功能。
class ServiceWindow
{
	private CustomerType type = CustomerType.COMMON;
	private int windowId = 1;
	//此处的数组是为了判断,其它两个窗口是否需要为普通服务窗口帮忙。
	private static Integer[] queueWindow = {0,0,0,0};

	public void setServiceWindow(CustomerType type,int windowId)
	{
		this.type = type;
		this.windowId = windowId;
	}

	public void start()
	{
		Executors.newSingleThreadExecutor().execute(new Runnable(){
			public void run()
			{
				int i = 1;
				switch(type)
				{
					case COMMON:
						while (i<1000)
						{
							commonService();
							i++;
						}
						break;

					case EXPRESS:
						while (i<500)
						{
							expressService();
							i++;
						}
						break;
						
					case VIP:
						while (i<100)
						{
							vipService();
							i++;
						}
						break;
				}
			}
		});
	}

	private void commonService()
	{
		String windowName = "第"+windowId+"号"+type+"窗口";
		Integer number = NumberMachine.getInstance().getCommonManager()
				.fetchServiceNumber();

		System.out.println(windowName+"正在获取普通业务服务。");
		if(number!=null)
		{
			queueWindow[windowId-1] = 1;

			long startTime = System.currentTimeMillis();
			try
			{
				System.out.println(windowName+"正在为第"+number
					+"位办理普通业务的顾客服务。");

				Thread.sleep(ServiceTime.fecthServiceTime(type));
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			System.out.println(windowName+"为第"+number
				+"位办理普通业务的顾客服务完毕,共耗时"
				+((System.currentTimeMillis()-startTime)/1000)+"秒");

			queueWindow[windowId-1] = 0;
		}
		else
		{
			System.out.println(windowName
				+"没有取到普通业务服务,休息1秒钟。");
			try
			{
				Thread.sleep(1000);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
	}

	private void expressService()
	{
		String windowName = "第"+windowId+"号"+type+"窗口";
		Integer number = NumberMachine.getInstance()
				.getExpressManager().fetchServiceNumber();

		System.out.println(windowName+"正在获取快速业务服务。");
		if(number!=null)
		{
			long startTime = System.currentTimeMillis();
			try
			{
				System.out.println(windowName+"正在为第"+number
					+"位办理快速业务的顾客服务。");

				Thread.sleep(ServiceTime.fecthServiceTime(type));
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			System.out.println(windowName+"为第"+number
				+"位办理快速业务的顾客服务完毕,共耗时"
				+((System.currentTimeMillis()-startTime)/1000)+"秒");
		}
		else
		{
			if(Arrays.asList(queueWindow).contains(0))
			{
				System.out.println(windowName
					+"没有取到快速业务服务,休息1秒钟。");
				try
				{
					Thread.sleep(1000);
				}
				catch (InterruptedException e)
				{
					e.printStackTrace();
				}
			}
			else
			{
				System.out.println(windowName+"没有取到快速业务服务。");
				commonService();
			}
		}
	}

	private void vipService()
	{
		String windowName = "第"+windowId+"号"+type+"窗口";
		Integer number = NumberMachine.getInstance()
				.getVipManager().fetchServiceNumber();

		System.out.println(windowName+"正在获取VIP业务服务。");
		if(number!=null)
		{
			long startTime = System.currentTimeMillis();
			try
			{
				System.out.println(windowName+"正在为第"+number
					+"位办理VIP业务的顾客服务。");

				Thread.sleep(ServiceTime.fecthServiceTime(type));
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			System.out.println(windowName+"为第"+number
				+"位办理VIP业务的顾客服务完毕,共耗时"
				+((System.currentTimeMillis()-startTime)/1000)+"秒");
		}
		else
		{
			if(Arrays.asList(queueWindow).contains(0))
			{
				System.out.println(windowName
					+"没有取到VIP业务服务,休息1秒钟。");
				try
				{
					Thread.sleep(1000);
				}
				catch (InterruptedException e)
				{
					e.printStackTrace();
				}
			}
			else
			{
				System.out.println(windowName+"没有取到VIP业务服务。");
				commonService();
			}
		}
	}
}


 

---------------------------------------- JavaEE+云物联、期待与您交流!---------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值