myeclipse2014
首先创建一个类来模拟到银行的客户,我称之为客户模拟器。package com.zyq.bank;import java.util.ArrayList;import java.util.List;/** * 客户模拟器 * @author zyq *时间:2016年11月25日下午10:44:34 * */public class NumberManager { private int lastNumber=1; List
创建一个类模拟银行职员叫号:我称之为取号器。package com.zyq.bank;/** * 取数模拟 * @author zyq *时间:2016年11月25日下午10:43:41 * */public class NumberMachine { //三种客户类别:普通客户 ,快速客户,vip客户 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; } //单列 private NumberMachine(){} public static NumberMachine getInstance(){ return instance; } private static NumberMachine instance=new NumberMachine(); }
创建一个枚举类,表明三类客户。package com.zyq.bank;/** * * 枚举类 *时间:2016年11月25日下午10:43:16 * */public enum CustomerType { COMMON,EXPRESS,VIP; public String toString(){ switch(this){ case COMMON: return '普通'; case EXPRESS: return '快速'; case VIP: return name(); } return null; }}
创建一个常量类,方便时间记录。package com.zyq.bank;/** * 常量类 *时间:2016年11月25日下午10:42:03 * */public class Constants { public static int MIN_SERVICE_TIME=1000; public static int MAX_SERVICE_TIME=10000; public static int COMMON_CUSTOMER_INTERVIEW=1;}
新建类模拟银行职员服务:服务窗口。package com.zyq.bank;import java.util.Random;import java.util.concurrent.Executors;/** * 服务窗口 * @author zyq *时间:2016年11月25日下午10:46:56 * */public class ServiceWindow { private CustomerType type=CustomerType.COMMON; private int windowId =1; /***** 此处设置set方法而不是有参数的构造方法 方便复用 ********/ public void setType(CustomerType type) { this.type = type; } public void setWindowId(int windowId) { this.windowId = windowId; } public void star() { //此处jdk5以后记忆 仅建立一个线程池 获取客户号 Executors.newSingleThreadExecutor().execute(new Runnable() { public void run() { while(true){ //亦可以用if 但是没有switvh效率高 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 number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber(); if(number != null){ System.out.println(windowName+'正在为'+number+'普通客户服务'); long beginTime=System.currentTimeMillis(); int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME; //产生【1000,10000】的随机数 模拟服务的时间 long serveTime=new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME; try { Thread.sleep(serveTime); } catch (InterruptedException e) { e.printStackTrace(); } //服务消耗的时间 long costTime=System.currentTimeMillis()-beginTime; System.out.println(windowName+'为第'+number+'号普通客户服务'+',耗时'+costTime/1000 +'秒'); }else{ System.out.println(windowName+'没有取到任务,先休息一下喝口水'); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } private void expressService() { Integer number=NumberMachine.getInstance().getExpressManager().fetchServiceNumber(); String windowName='第'+ windowId +'号' +type +'窗口'; System.out.println(windowName+'正在获取快速任务'); if(number != null){ System.out.println(windowName+'正在为'+number+'号'+type+'快速客户服务'); long beginTime=System.currentTimeMillis(); //int maxRandom=Constants.MAX_SERVICE_TIME-; //产生【1000,10000】的随机数 模拟服务的时间 //long serveTime=new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME; 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(); } } private void vipService() { Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber(); String windowName='第'+ windowId +'号' +type +'窗口'; System.out.println(windowName+'正在获取VIP任务'); if(number != null){ System.out.println(windowName+'正在为'+number+'号'+type+'客户服务'); long beginTime=System.currentTimeMillis(); int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME; //产生【1000,10000】的随机数 模拟服务的时间 long serveTime=new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME; try { Thread.sleep(serveTime); } catch (InterruptedException e) { e.printStackTrace(); } //服务消耗的时间 long costTime=System.currentTimeMillis()-beginTime; System.out.println(windowName+'为第'+number+'号'+type+'客户服务'+costTime/1000 +'秒'); }else{ System.out.println(windowName+'没有取到任务,继续为普通用户服务,就别喝水了'); commonService(); } }}
写一个测试类来测试代码的准确性。package com.zyq.bank;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;/** * 测试类 * @author zyq *时间:2016年11月25日下午11:48:37 * */public class MainClass { public static void main(String[] args) { //产生4个普通窗口 for (int i = 1; i < 5; i++) { ServiceWindow commonWindow=new ServiceWindow(); commonWindow.setWindowId(i); commonWindow.star(); } //产生一个快速窗口 ServiceWindow expressWindow=new ServiceWindow(); expressWindow.setType(CustomerType.EXPRESS); expressWindow.star(); //产生一个VIP窗口 ServiceWindow vipWindow=new ServiceWindow(); vipWindow.setType(CustomerType.VIP); vipWindow.star(); //普通客户拿号 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable() { public void run() { Integer number=NumberMachine.getInstance().getCommonManager().generateNewNumber(); System.out.println(number+'号普通客户正在等待服务'); } }, 0, Constants.COMMON_CUSTOMER_INTERVIEW, TimeUnit.SECONDS ); //快速客户拿号 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable() { public void run() { Integer number=NumberMachine.getInstance().getExpressManager().generateNewNumber(); System.out.println(number+'号快速客户正在等待服务'); } }, 0, Constants.COMMON_CUSTOMER_INTERVIEW * 6, TimeUnit.SECONDS ); //VIP客户拿号 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable() { public void run() { Integer number=NumberMachine.getInstance().getVipManager().generateNewNumber(); System.out.println(number+'号VIP客户正在等待服务'); } }, 0, Constants.COMMON_CUSTOMER_INTERVIEW * 2, TimeUnit.SECONDS ); } }
测试结果如下:第1号普通窗口正在获取普通任务第1号普通窗口没有取到任务,先休息一下喝口水第2号普通窗口正在获取普通任务第2号普通窗口没有取到任务,先休息一下喝口水第3号普通窗口正在获取普通任务第3号普通窗口没有取到任务,先休息一下喝口水第4号普通窗口正在获取普通任务第4号普通窗口没有取到任务,先休息一下喝口水第1号VIP窗口正在获取VIP任务第1号VIP窗口没有取到任务,继续为普通用户服务,就别喝水了第1号VIP窗口正在获取普通任务第1号VIP窗口没有取到任务,先休息一下喝口水第1号快速窗口正在获取快速任务第1号快速窗口没有取到任务,继续为普通客户服务第1号快速窗口正在获取普通任务第1号快速窗口没有取到任务,先休息一下喝口水1号普通客户正在等待服务1号快速客户正在等待服务1号VIP客户正在等待服务第1号普通窗口正在获取普通任务第1号普通窗口正在为2普通客户服务第1号快速窗口正在获取快速任务》》一直运行中....
不需要倒入任何jar包。
jdk要使用1.5之后的。
牵涉线程的一般很难一下明白,仿照代码多看几次,相信有所收获。
仅供参考!