A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 铿锵科技 中级黑马   /  2013-2-1 14:52  /  2812 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看了张考祥的视频后,自已动手来做了一个银行业务系统模拟
需求的和张老师的视频中的一样其它不多说了来代码
写一个顾客的枚举
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<Integer> generalQueue = new ArrayList<Integer>();
        private ArrayList<Integer> rapidQueue = new ArrayList<Integer>();
        private ArrayList<Integer> vipQueue = new ArrayList<Integer>();
        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 Integer getGeneralNumber() {
                if (generalQueue.isEmpty())
                        return null;
                return generalQueue.remove(0);
        }

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

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

        private 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号快速业务客户服务...
附上原代码



银行业务调度系统模拟.zip

12.71 KB, 阅读权限: 20, 下载次数: 7

点评

请参看下17期版规,==========《第17届板块必看版规》========== http://bbs.itheima.com/thread-35788-1-1.html 这里有对技术分获取的细则  发表于 2013-2-2 10:22

3 个回复

倒序浏览
       //考虑多线程安全问题加上同步锁
        public synchronized Integer getGeneralNumber() {
                if (generalQueue.isEmpty())
                        return null;
                return generalQueue.remove(0);
        }

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

        public synchronized Integer getVipNumber() {
                if (vipQueue.isEmpty())
                        return null;
                return vipQueue.remove(0);
        }
回复 使用道具 举报
      public ServiceWindow(final CustomerType customerType, final int windowId) {
                new Thread(new Runnable() {
                        @Override
                        public void run() {
                                while (true) {
                                        server(customerType, windowId);
                                }
                        }
                }).start();
        }
回复 使用道具 举报
我来学习下!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马