黑马程序员 改进版银行业务调度系统

     ------- android培训java培训、期待与您交流! ----------

    我在原有代码的基础上进行了一下改进,增加了Controller类 

public class Controller {
	private static final int CUSTOMER_FETCH = 1;
	private ScheduledExecutorService sch = Executors.newScheduledThreadPool(3);
	
	public Controller() {
		ServiceWindow.普通1.service();
		ServiceWindow.普通2.service();
		ServiceWindow.普通3.service();
		ServiceWindow.普通4.service();
		ServiceWindow.快速.service();
		ServiceWindow.VIP.service();
	}

	public void schedule() {
		// 普通客户
		sch.scheduleAtFixedRate(new Runnable() {

			@Override
			public void run() {
				synchronized(this){
					Integer serviceNumber = NumberGenerator.common.generalNewNumber();
					System.out.println("第" + serviceNumber + "号普通客户正在等待服务!");
				}
			}
		}, 0, CUSTOMER_FETCH, TimeUnit.SECONDS);
		// 快速客户
		sch.scheduleAtFixedRate(new Runnable() {

			@Override
			public void run() {
				synchronized(this){
					Integer serviceNumber = NumberGenerator.express.generalNewNumber();
					System.out.println("第" + serviceNumber + "号快速客户正在等待服务!");
				}
			}
		}, 0, CUSTOMER_FETCH * 2, TimeUnit.SECONDS);
		// vip客户
		sch.scheduleAtFixedRate(new Runnable() {

			@Override
			public void run() {
				synchronized(this){
					Integer serviceNumber = NumberGenerator.vip.generalNewNumber();
					System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!");
				}
			}
		}, 0, CUSTOMER_FETCH * 6, TimeUnit.SECONDS);
	}
}

    调用方法

public class Run {

	public static void main(String[] args) {

		new Controller().schedule();
	}
}

    ServiceWindow类采用枚举进行重写

public enum ServiceWindow {
	普通1("普通", 1), 普通2("普通", 2), 普通3("普通", 3), 普通4("普通", 4), 快速(
			"快速", 5), VIP("VIP", 6);
	private static final int MAX = 10;
	private static final int MIN = 1;
	private String type;
	private int id;
	String windowName = this.name();
	private ExecutorService pool;

	public int getId() {
		return id;
	}

	private ServiceWindow(String type, int id) {
		this.type = type;
		this.id = id;
		pool = Executors.newSingleThreadExecutor();
	}

	public void service() {
		pool.execute(new Runnable() {
			@Override
			public void run() {
				while (true) {
					switch (type) {
					case "普通":
						commonService();
						break;
					case "快速":
						expressService();
						break;
					case "VIP":
						vipService();
						break;
					}
				}
			}
		});

	}
 
	private synchronized void vipService() {
		Integer customerNum = NumberGenerator.vip.fetchNumber();
		if (customerNum != 0) {
			System.out.println(id + "号" + type + "窗口开始为" + customerNum + "号vip客户服务");
			int serviceTime = new Random().nextInt(MAX - MIN) + 1 + MIN;
			try {
				Thread.sleep(serviceTime * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(id + "号" + type + "窗口完成为第" + customerNum
					+ "号vip客户服务,总共耗时" + serviceTime + "秒");
		} else {
			System.out.println(windowName + "没有取到vip任务");
			commonService();
		}
	}

	private synchronized void expressService() {
		Integer customerNum = NumberGenerator.express.fetchNumber();
		if (customerNum != 0) {
			System.out.println(id + "号" + type + "窗口开始为" + customerNum + "号快速客户服务");
			int serviceTime = MIN;
			try {
				Thread.sleep(serviceTime * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(id + "号" + type + "窗口完成为第" + customerNum
					+ "号快速客户服务,总共耗时" + serviceTime + "秒");
		} else {
			System.out.println(windowName + "没有取到快速任务");
			commonService();
		}

	}

	private synchronized void commonService() {
		int customerNum = NumberGenerator.common.fetchNumber();
		if (customerNum != 0) {
			System.out.println(id + "号" + type + "窗口开始为" + customerNum + "号普通客户服务");
			int serviceTime = new Random().nextInt(MAX - MIN) + 1 + MIN;
			try {
				Thread.sleep(serviceTime * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(id + "号" + type + "窗口完成为第" + customerNum
					+ "号普通客户服务,总共耗时" + serviceTime + "秒");
		} else {
			System.out.println(windowName + "没有取到普通任务,正在空闲一秒");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

    排号生成器也用枚举重写

public enum NumberGenerator {
	common,express,vip;
	private int num = 0;
	private LinkedList<Integer> list = new LinkedList<>();

	public int generalNewNumber() {
		synchronized(this){
			list.addLast(++num);
		}
		return num;
	}

	public int fetchNumber() {
		if (list.size() > 0)
			synchronized(list){
				return list.removeFirst();
			}
		else
			return 0;
	}
}

    执行结果

普通1没有取到普通任务,正在空闲一秒
普通3没有取到普通任务,正在空闲一秒
快速没有取到快速任务
快速没有取到普通任务,正在空闲一秒
第1号普通客户正在等待服务!
2号普通窗口开始为1号普通客户服务
VIP没有取到vip任务
VIP没有取到普通任务,正在空闲一秒
普通4没有取到普通任务,正在空闲一秒
第1号快速客户正在等待服务!
第1号VIP客户正在等待服务!
第2号普通客户正在等待服务!
1号普通窗口开始为2号普通客户服务
5号快速窗口开始为1号快速客户服务
普通3没有取到普通任务,正在空闲一秒
普通4没有取到普通任务,正在空闲一秒
6号VIP窗口开始为1号vip客户服务
第3号普通客户正在等待服务!
5号快速窗口完成为第1号快速客户服务,总共耗时1秒
快速没有取到快速任务
3号普通窗口开始为3号普通客户服务
快速没有取到普通任务,正在空闲一秒
普通4没有取到普通任务,正在空闲一秒
第2号快速客户正在等待服务!
第4号普通客户正在等待服务!
5号快速窗口开始为2号快速客户服务
4号普通窗口开始为4号普通客户服务
第5号普通客户正在等待服务!
3号普通窗口完成为第3号普通客户服务,总共耗时2秒
3号普通窗口开始为5号普通客户服务
5号快速窗口完成为第2号快速客户服务,总共耗时1秒
快速没有取到快速任务
快速没有取到普通任务,正在空闲一秒
第3号快速客户正在等待服务!
第6号普通客户正在等待服务!
1号普通窗口完成为第2号普通客户服务,总共耗时4秒
2号普通窗口完成为第1号普通客户服务,总共耗时5秒
1号普通窗口开始为6号普通客户服务
普通2没有取到普通任务,正在空闲一秒
5号快速窗口开始为3号快速客户服务
6号VIP窗口完成为第1号vip客户服务,总共耗时4秒
VIP没有取到vip任务
VIP没有取到普通任务,正在空闲一秒
第7号普通客户正在等待服务!
2号普通窗口开始为7号普通客户服务
5号快速窗口完成为第3号快速客户服务,总共耗时1秒
快速没有取到快速任务
快速没有取到普通任务,正在空闲一秒
VIP没有取到vip任务
VIP没有取到普通任务,正在空闲一秒
第4号快速客户正在等待服务!
第2号VIP客户正在等待服务!
第8号普通客户正在等待服务!
3号普通窗口完成为第5号普通客户服务,总共耗时3秒
3号普通窗口开始为8号普通客户服务
5号快速窗口开始为4号快速客户服务
6号VIP窗口开始为2号vip客户服务
第9号普通客户正在等待服务!
1号普通窗口完成为第6号普通客户服务,总共耗时3秒
1号普通窗口开始为9号普通客户服务
5号快速窗口完成为第4号快速客户服务,总共耗时1秒
快速没有取到快速任务
快速没有取到普通任务,正在空闲一秒
第5号快速客户正在等待服务!
第10号普通客户正在等待服务!
5号快速窗口开始为5号快速客户服务
6号VIP窗口完成为第2号vip客户服务,总共耗时2秒
VIP没有取到vip任务
6号VIP窗口开始为10号普通客户服务
第11号普通客户正在等待服务!
4号普通窗口完成为第4号普通客户服务,总共耗时7秒
5号快速窗口完成为第5号快速客户服务,总共耗时1秒
快速没有取到快速任务
5号快速窗口开始为11号普通客户服务
普通4没有取到普通任务,正在空闲一秒
第6号快速客户正在等待服务!
第12号普通客户正在等待服务!
4号普通窗口开始为12号普通客户服务
第13号普通客户正在等待服务!
第7号快速客户正在等待服务!
第3号VIP客户正在等待服务!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值