银行业务调度

个人任务这项目比交通灯稍微复杂一点点。不过还是能弄明白的,不像那移动资费视频,看的都大。在这项目中有客户类(普通客户,快速客户,VIP客户),有服务窗口类,在银行办理业务排队是根据手中所拿的号码的先后顺序办理业务的,所以有个号码管理器(NumberManager),不断生成号码。在这个项目中应该有个NumberMachine类, 用来管理客户类的,他有三个属性都是NumberManager类型的代表三类客户。

NumberManager.java

package cn.itcast.interview.bank;

import java.util.ArrayList;
import java.util.List;

public class NumberManager {

	private int lastNumber = 0;
	private List<Integer> numbers = new ArrayList<Integer>();
	
	public synchronized int genernateNewNumber() {
		numbers.add(lastNumber++);
		return lastNumber;
	}
	
	//获取即将服务的号码
	public synchronized Integer fetchServiceNumber() {
		if (numbers.size() > 0) {
			return numbers.remove(0);
		}
		return null;
	}
}

NumberMachine.java

package cn.itcast.interview.bank;

public class NumberMachine {
	
	private static NumberMachine instance = new NumberMachine();
	
	private NumberManager common = new NumberManager();
	private NumberManager express = new NumberManager();
	private NumberManager vip = new NumberManager();
	
	public NumberManager getCommon() {
		return common;
	}
	public NumberManager getExpress() {
		return express;
	}
	public NumberManager getVip() {
		return vip;
	}
	
	private NumberMachine() {}
	
	public static NumberMachine getInstance() {
		return instance;
	}
}

CustomerType.java

package cn.itcast.interview.bank;

public enum CustomerType {

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

ServeTime.java

package cn.itcast.interview.bank;

public class ServeTime {

	public static final int MAX_SERVE_TIME = 10000;
	public static final int MIN_SERVE_TIME = 1000;
	public static final int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}

ServcieWindow.java

package cn.itcast.interview.bank;

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

public class ServiceWindow {

	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;
	}

	// ServiceWindow 为什么具有start方法
	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;
							}
						}
					}
				}
				);
	}

	private void commonService() {
		String windowName = "第" + windowId + "号"+ type + "窗口";
		System.out.println(windowName + "正在获取普通任务");
		Integer serviceNumber = NumberMachine.getInstance().getCommon().fetchServiceNumber();
		int maxRandomTime = ServeTime.MAX_SERVE_TIME - ServeTime.MIN_SERVE_TIME;
		int serviceTime = new Random().nextInt(maxRandomTime + 1) + ServeTime.MIN_SERVE_TIME;
		if (serviceNumber != null) {
			System.out.println(windowName + "开始为" + serviceNumber + "号普通客户服务");
			try {
				Thread.sleep(serviceTime);
				System.out.println(windowName + "为" + serviceNumber + "号普通客户服务, -----> 耗时" + serviceTime/1000 + "秒");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} else {
			System.out.println(windowName + "没有获取普通任务, 空闲一秒");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	private void expressService() {
		String windowName = "第" + windowId + "号"+ type + "窗口";
		System.out.println(windowName + "正在获取快速任务");
		Integer serviceNumber = NumberMachine.getInstance().getExpress().fetchServiceNumber();
		int maxRandomTime = ServeTime.MAX_SERVE_TIME - ServeTime.MIN_SERVE_TIME;
		int serviceTime = ServeTime.MIN_SERVE_TIME;
		if (serviceNumber != null) {
			System.out.println(windowName + "开始为" + serviceNumber + "号快速客户服务");
			try {
				Thread.sleep(serviceTime);
				System.out.println(windowName + "为" + serviceNumber + "号快速客户服务, -----> 耗时" + serviceTime/1000 + "秒");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} else {
			System.out.println(windowName + "没有获取快速任务");
			commonService();
		}
		
	}
	
	private void vipService() {
		String windowName = "第" + windowId + "号"+ type + "窗口";
		System.out.println(windowName + "正在获取VIP任务");
		Integer serviceNumber = NumberMachine.getInstance().getVip().fetchServiceNumber();
		int maxRandomTime = ServeTime.MAX_SERVE_TIME - ServeTime.MIN_SERVE_TIME;
		int serviceTime = new Random().nextInt(maxRandomTime + 1) + ServeTime.MIN_SERVE_TIME;
		if (serviceNumber != null) {
			System.out.println(windowName + "开始为" + serviceNumber + "号VIP客户服务");
			try {
				Thread.sleep(serviceTime);
				System.out.println(windowName + "为" + serviceNumber + "号VIP客户服务, -----> 耗时" + serviceTime/1000 + "秒");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} else {
			System.out.println(windowName + "没有获取VIP任务");
			commonService();
		}
		
	}
}


MainClass.java

package cn.itcast.interview.bank;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class MainClass {

	public static void main(String[] args) {
		for (int i=1; i<5; i++) {
			ServiceWindow commonWindow = new ServiceWindow();
			commonWindow.setWindowId(i);
			commonWindow.start();
		}
		
		ServiceWindow expressWindow = new ServiceWindow();
		expressWindow.setType(CustomerType.EXPRESS);
		expressWindow.start();
		
		ServiceWindow vipWindow = new ServiceWindow();
		vipWindow.setType(CustomerType.VIP);
		vipWindow.start();
		
		//普通客户获取号
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable() {
					public void run() {
						Integer number = NumberMachine.getInstance().getCommon().genernateNewNumber();
						if (number != null) {
							System.out.println("第" + number + "号普通客户正在等待服务");
						}
					}
				}, 
				0,
				ServeTime.COMMON_CUSTOMER_INTERVAL_TIME,
				TimeUnit.SECONDS
				);
		//快速客户获取号		
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable() {
					public void run() {
						Integer number = NumberMachine.getInstance().getExpress().genernateNewNumber();
						if (number != null) {
							System.out.println("第" + number + "号快速客户正在等待服务");
						}
					}
				}, 
				0,
				ServeTime.COMMON_CUSTOMER_INTERVAL_TIME * 2,
				TimeUnit.SECONDS
				);
		//VIP客户获取号
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable() {
					public void run() {
						Integer number = NumberMachine.getInstance().getCommon().genernateNewNumber();
						if (number != null) {
							System.out.println("第" + number + "号VIP客户正在等待服务");
						}
					}
				}, 
				0,
				ServeTime.COMMON_CUSTOMER_INTERVAL_TIME * 6,
				TimeUnit.SECONDS
				);
	}
}


你可能感兴趣的:(银行业务调度)