读书人

黑马软件工程师_银行业务调度系统(二

发布时间: 2012-10-08 19:54:56 作者: rapoo

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

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

?

?

????????????下面就贴出本系统的代码,呵呵,同样源代码版权属传智播客,以供大家交流和学习。

?

?????????? NumberMachine类的代码如下:

?

package cn.itcast.back;/** * 银行取号机只有一个,故将其设计为单例 * 此类用来管理三中不同类型的号码管理器 */public class NumberMachine {/** 此属性表示普通窗口号码管理器*/private NumberManager commonManager = new NumberManager();/** 此属性表示快速窗口号码管理器*/private NumberManager expressManager = new NumberManager();/** 此属性表示vip窗口号码管理器*/private NumberManager vipManager = new NumberManager();/** 此属性表示一个取号机的实例*/private static NumberMachine instance = new NumberMachine();public NumberManager getCommonManager() {return commonManager;}public NumberManager getExpressManager() {return expressManager;}public NumberManager getVipManager() {return vipManager;}private NumberMachine() {}public static NumberMachine getInstance() {return instance;}}

?

?????????? NumberManager类的代码如下:

package cn.itcast.back;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;}}

?

?????????? ServiceWindow类的代码如下:

?

??????

package cn.itcast.back;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;}public void start() {// 此处使用java 5中的并发线程库,效率更高Executors.newSingleThreadExecutor().execute(new Runnable() {@Overridepublic void run() {while (true) {switch (type) {case COMMON:commonService();break;case EXPRESS:expressService();break;case VIP:vipService();break;default:break;}}}});}/** * 此方法为普通客户服务 */private void commonService() {String windowName = "第" + windowId + "号" + type + "窗口";Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();System.out.println(windowName + "正在获取任务...");if (number != null) {System.out.println(windowName + "为第" + number + "个普通" + "客户服务");long beginTime = System.currentTimeMillis();int maxRandom = Constants.MAX_SERVICE_TIME- Constants.MIN_SERVICE_TIME;long serviceTime = new Random().nextInt(maxRandom) + 1+ Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}long costTime = System.currentTimeMillis() - beginTime;System.out.println(windowName + "为第" + number + "个" + type+ "客户完成服务,耗时:" + costTime / 1000 + "秒");} else {System.out.println(windowName + "没有取到任务,先休息一秒钟!");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) {System.out.println(windowName + "为第" + number + "个" + type + "客户服务");long beginTime = System.currentTimeMillis();try {Thread.sleep(Constants.MIN_SERVICE_TIME);} catch (InterruptedException e) {e.printStackTrace();}long costTime = System.currentTimeMillis() - beginTime;System.out.println(windowName + "为第" + number + "个" + type+ "客户完成服务,耗时:" + costTime / 1000 + "秒");} else {System.out.println(windowName + "没有取到任务");commonService();}}/** * 此方法为vip客户服务 */private void vipService() {String windowName = "第" + windowId + "号" + type + "窗口";Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();System.out.println(windowName + "正在获取任务...");if (number != null) {System.out.println(windowName + "为第" + number + "个" + type + "客户服务");long beginTime = System.currentTimeMillis();int maxRandom = Constants.MAX_SERVICE_TIME- Constants.MIN_SERVICE_TIME;long serviceTime = new Random().nextInt(maxRandom) + 1+ Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}long costTime = System.currentTimeMillis() - beginTime;System.out.println(windowName + "为第" + number + "个" + type+ "客户完成服务,耗时:" + costTime / 1000 + "秒");} else {System.out.println(windowName + "没有取到任务");commonService();}}}

????

?????????? CustomerType类的代码如下:

package cn.itcast.back;public enum CustomerType {COMMON, EXPRESS, VIP;public String toString() {switch (this) {case COMMON:return "普通";case EXPRESS:return "快速";case VIP:return name();}return null;}}

?

????????? Constants类的代码如下(此类用于提供系统中用到的一些常量):

package cn.itcast.back;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;}

?

?????????? 程序的启动类MainClass类的代码如下:

package cn.itcast.back;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() {@Overridepublic void run() {Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();System.out.println(number + "号普通客户等待服务");}}, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME, TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();System.out.println(number + "号快速客户等待服务");}}, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME*6, TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {Integer number = NumberMachine.getInstance().getVipManager().generateNewManager();System.out.println(number + "号vip客户等待服务");}}, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME*2, TimeUnit.SECONDS);}}

?

??????

???????????? 通过对本系统的学习,发现自己在对java 5的并发线程库的学习还不够,回去再补补并发线程库的知识以及得深入学习一下线程同步死锁问题,就是多加几把锁后再看看该线程执行情况。

?

????????

??????????

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

?

详细请查看:http://edu.csdn.net/heima

?

?

读书人网 >编程

热点推荐