黑马程序员_java进阶之-银行业务调度系统模拟(二)

 ------------- java培训、android培训、java博客、java学习型技术博客、期待与您交流! --------------



看了张考祥的视频后,自已动手来做了一个银行业务系统模拟

需求的和张老师的视频中的一样其它不多说了来代码
写一个顾客的枚举
public enum CustomerType {
        GENERAL, RAPIDBUSINESS, VIP;
        @Override
        public String toString() {
                switch (this) {
                case GENERAL:
                        return "普通";
                case RAPIDBUSINESS:
                        return "快速业务";
                case VIP:
                        return "VIP";
                }
                return super.toString();
        }
}
写一个号码机器类(一个银行只有一个叫号机,采用单例设计模式)管理3个队列用ArrayList装载数据,并在号码机器类的构造函数中随机生成顾客
import java.util.ArrayList;
import java.util.Random;

public class NumberMachine {
        private ArrayList generalQueue = new ArrayList();
        private ArrayList rapidQueue = new ArrayList();
        private ArrayList vipQueue = new ArrayList();
        private static NumberMachine instance = new NumberMachine();
        private int generalNumber = 1;
        private int rapidNumber = 1;
        private int vipNumber = 1;

        public static NumberMachine getInstance() {
                return instance;
        }

        // 获取顾客号码函数号码存在ArrayList中

//多线程安全加上同步锁
        public synchronized Integer getGeneralNumber() {
                if (generalQueue.isEmpty())
                        return null;
                return generalQueue.remove(0);
        }

        public Integer getRapidNumber() {
                if (rapidQueue.isEmpty())
                        return null;
                return rapidQueue.remove(0);
        }

        public synchronized Integer getVipNumber() {
                if (vipQueue.isEmpty())
                        return null;
                return vipQueue.remove(0);
        }

        private synchronized NumberMachine() {
                new Thread(new Runnable() {
                        @Override
                        public void run() {
                                while (true) {
                                        // 进来一个顾客后一秒后再来一个循环
                                        genCustomer();
                                        // 3个集合装的数据代表顾客数如果大于50提示人太多
                                        int sum = generalQueue.size() + rapidQueue.size()
                                                        + vipQueue.size();
                                        if (sum > 50) {
                                                System.out.println("人太多了,请你多等一会");
                                                try {
                                                        Thread.sleep(10000);// 人太多了休息10秒
                                                } catch (InterruptedException e) {
                                                        e.printStackTrace();
                                                }
                                        } else {
                                                System.out.println(sum+"人在排队等待服务");
                                                try {
                                                        Thread.sleep(1000);
                                                } catch (InterruptedException e) {
                                                        e.printStackTrace();
                                                }
                                        }
                                }
                        }
                }).start();
        }

        // 生成顾客函数
        private void genCustomer() {
                // 随机生顾客的比例GENERAL:RAPIDBUSINESS:VIP是1:3:6
                int ranint = new Random().nextInt(10);
                switch (ranint) {
                case 0:// 来10个只有一个是VIP
                        vipQueue.add(vipNumber++);
                        break;
                case 1:// 来10个有3个是RAPIDbUSINESS
                case 2:
                case 3:
                        rapidQueue.add(rapidNumber++);
                        break;
                default:// 其它的是GENERAL
                        generalQueue.add(generalNumber++);
                }
        }
}
写一个银行窗口服务类,并在构造函数中开启服务,
import java.util.Random;
public class ServiceWindow {
        public ServiceWindow(final CustomerType customerType, final int windowId) {
                new Thread(new Runnable() {
                        @Override
                        public void run() {
                                while (true) {
                                        server(customerType, windowId);
                                }
                        }
                }).start();
        }
        //银行窗口服务函数
        private void server(CustomerType customerType, int windowId) {
                String windowName = "第" + windowId +"号"+ customerType.toString() + "窗口";
                System.out.println(windowName + "正在获取服务");
                Integer number = null;
                switch (customerType) {
                case GENERAL:
                        number = NumberMachine.getInstance().getGeneralNumber();
                        service( windowName, CustomerType.GENERAL,number);
                        break;
                case RAPIDBUSINESS:
                        number = NumberMachine.getInstance().getRapidNumber();
                        if (number != null) {//获取快速业务顾客
                                service( windowName, CustomerType.RAPIDBUSINESS,number);
                        } else {//快速业务没顾客时获取普通业务顾客
                                number = NumberMachine.getInstance().getGeneralNumber();
                                service( windowName, CustomerType.GENERAL,number);
                        }
                        break;
                case VIP:
                        number = NumberMachine.getInstance().getVipNumber();
                        if (number != null) {//获取VIP客户
                                service( windowName, CustomerType.VIP,number);
                        } else {//没VIP客户时获取普通业务顾客
                                number = NumberMachine.getInstance().getGeneralNumber();
                                service( windowName, CustomerType.GENERAL,number);
                        }
                }
        }
        //窗口服务客户的函数
        public void service(String windowName,CustomerType customerType, 
                        Integer number) {
                if (number != null) {
                        System.out.println(windowName + "正在为第" + number + "号"+customerType.toString()+"客户服务...");
                        spendTime(windowName, customerType, number);
                } else{
                        System.out.println(windowName + "没有服务对象,休息1秒");
                        try {
                                Thread.sleep(1000);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
        }

        // 随机生成客户服务时间
        public void spendTime(String windowName, CustomerType customerType,
                        Integer number) {
                long serviceTime = 0;
                long beginTime = System.currentTimeMillis();
                if (customerType == CustomerType.RAPIDBUSINESS) {
                        serviceTime = Constants.MIN_SERVICE_TIME;
                } else {
                        int random = new Random().nextInt(Constants.MAX_SERVICE_TIME) + 1;
                        serviceTime = (random < Constants.MIN_SERVICE_TIME ? Constants.MIN_SERVICE_TIME
                                        : random);
                }
                try {
                        Thread.sleep(serviceTime);
                } catch (InterruptedException e) {
                        System.out.println("出错了" + e);
                }
                long costTime = System.currentTimeMillis() - beginTime;
                System.out.println(windowName + "为" + number+"号 "+ customerType.toString()
                                + "客户完成服务,耗时:" + (costTime / 1000) + "秒。。。。。。");
        }
}

常量类
public class Constants {
        public static int MAX_SERVICE_TIME=10000;//最大服务时间毫秒
        public static int MIN_SERVICE_TIME=1000;//最小服务时间毫秒
}

写一个银行主类调用窗口服务,启动叫号机
public class Banker {

        /**
         * @param args
         * @author zhang wei feng 
         * @QQ:404486310
         */
        public static void main(String[] args) {
                System.out.println("银行开始营业了!");
                //开启4个普通窗口
                for (int i = 1; i <= 4; i++) {
                        new ServiceWindow(CustomerType.GENERAL, i);
                }
                //开启一个快速业务窗口
                new ServiceWindow(CustomerType.RAPIDBUSINESS, 5);
                //开启一个VIP窗口
                new ServiceWindow(CustomerType.VIP, 6);
                //启动叫号机
                NumberMachine.getInstance();
        }
}
部分运行结果如下
第5号快速业务窗口为14号 快速业务客户完成服务,耗时:1秒。。。。。。
第5号快速业务窗口正在获取服务
第5号快速业务窗口正在为第39号普通客户服务...
第3号普通窗口正在获取服务
第3号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
1人在排队等待服务
第3号普通窗口正在获取服务
第3号普通窗口正在为第40号普通客户服务...
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
1人在排队等待服务
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
2人在排队等待服务
第3号普通窗口为40号 普通客户完成服务,耗时:1秒。。。。。。
第3号普通窗口正在获取服务
第3号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
3人在排队等待服务
第3号普通窗口正在获取服务
第3号普通窗口正在为第41号普通客户服务...
第2号普通窗口为36号 普通客户完成服务,耗时:9秒。。。。。。
第2号普通窗口正在获取服务
第2号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
3人在排队等待服务
第2号普通窗口正在获取服务
第2号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
4人在排队等待服务
第3号普通窗口为41号 普通客户完成服务,耗时:1秒。。。。。。
第3号普通窗口正在获取服务
第3号普通窗口正在为第42号普通客户服务...
第4号普通窗口为37号 普通客户完成服务,耗时:9秒。。。。。。
第4号普通窗口正在获取服务
第4号普通窗口没有服务对象,休息1秒
第2号普通窗口正在获取服务
第2号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
4人在排队等待服务
第4号普通窗口正在获取服务
第4号普通窗口没有服务对象,休息1秒
第2号普通窗口正在获取服务
第2号普通窗口没有服务对象,休息1秒
第1号普通窗口正在获取服务
第1号普通窗口没有服务对象,休息1秒
5人在排队等待服务
第6号VIP窗口为38号 普通客户完成服务,耗时:9秒。。。。。。
第6号VIP窗口正在获取服务
第6号VIP窗口正在为第9号VIP客户服务...
第5号快速业务窗口为39号 普通客户完成服务,耗时:7秒。。。。。。
第5号快速业务窗口正在获取服务
第5号快速业务窗口正在为第15号快速业务客户服务...

你可能感兴趣的:(Java技术学习)