黑马程序员-有关银行调度系统的笔记和总结

来源:互联网 发布:平安证券java面试 编辑:程序博客网 时间:2024/05/18 01:09

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

黑马程序员-有关银行调度系统的笔记和总结

/*

银行业务调度系统

需求:

1,银行内有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口

2,有三种对应类型的客户:VIP客户,普通客户,快速客户。

3,异步随机生成各种类型的客户,生成各类型用户的概率比例

       为:VIP客户:普通客户:快速客户  =  16 3

4,各类型客户在其对应窗口按顺序依次办理业务。

5,当VIP6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,

       这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,

       则优先处理对应客户的业务。

6,随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。

7,不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

总结:

1,用面向对象的方式来编写代码,很大程度上简化了实例实现的过程

2,当一个变量有多种可能的取值时,最好使用枚举类。

3,使用线程池将大大的节省资源的利用,多线程执行的时候要注意线程之间的协调执行,以免产生死锁,或者运行结果混乱。

 

 

课堂笔记代码如下:

*/

package cn.itcast.bankqueue;  

import java.util.ArrayList; 

import java.util.List;   

public class NumberManager { 

    private int lastNumber = 0; 

    private List queueNumbers = new ArrayList();      

    //同步的产生号码方法  

    public synchronized Integer generateNewNumber(){ 

        queueNumbers.add(++lastNumber); 

        return lastNumber; 

    }       

    //获取号码  

    public synchronized Integer fetchNumber(){ 

        if(queueNumbers.size()>0){ 

            return (Integer)queueNumbers.remove(0);

                     //如果队列中有号码,则获取第一个(移除角标0的元素)  

        }else{ 

            return null; 

        } 

    } 

package cn.itcast.bankqueue;   

public class NumberMachine {   

    //饿汉式单例设计模式来生成客户号码编号  

    private NumberMachine(){} 

    private static NumberMachine instance = new NumberMachine(); 

    public static NumberMachine getInstance(){ 

        return instance; 

    }       

    //三种客户的号码管理器,由方法获取对象  

    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; 

    } 

     

package cn.itcast.bankqueue;  

//3种客户类型设定成枚举类  

public enum CustomerType { 

    COMMON,EXPRESS,VIP; 

    public String toString(){ 

        String name = null; 

        switch(this){ 

        case COMMON: 

            name = "普通"; 

            break; 

        case EXPRESS: 

            name = "快速"; 

            break; 

        case VIP: 

            name = name(); 

            break; 

        } 

        return name; 

    } 

package cn.itcast.bankqueue; 

 

import java.util.Random; 

import java.util.concurrent.Executors; 

import java.util.logging.Logger; 

 

/*

没有把VIP窗口和快速窗口做成子类,是因为实际业务中的普通窗口可以随时被设置为VIP窗口和快速窗口。

*/ 

public class ServiceWindow { 

    private static Logger logger = Logger.getLogger("cn.itcast.bankqueue"); 

    private CustomerType type = CustomerType.COMMON; 

    private int number = 1;     //号码从1开始  

 

    public CustomerType getType() { 

        return type; 

    } 

 

    public void setType(CustomerType type) { 

        this.type = type; 

    } 

     

    public void setNumber(int number){ 

        this.number = number; 

    } 

     

    public void start(){ 

        Executors.newSingleThreadExecutor().execute( 

                new Runnable(){ 

                    public void run(){    

                        while(true){ 

                            switch(type){ 

                                case COMMON: 

                                    commonService(); 

                                    break; 

                                case EXPRESS: 

                                    expressService(); 

                                    break; 

                                case VIP: 

                                    vipService(); 

                                    break; 

                            } 

                        } 

                    } 

                } 

        ); 

    }     

    private void commonService(){ 

        String windowName = "" + number + "" + type + "窗口";        

        System.out.println(windowName + "开始获取普通任务!"); 

        Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber();        

        if(serviceNumber != null ){ 

            System.out.println(windowName + "开始为第" + serviceNumber + "号普通客户服务");         

            int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; 

            int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME; 

     

            try { 

                Thread.sleep(serviceTime); 

            } catch (InterruptedException e) { 

                e.printStackTrace(); 

            }    

            System.out.println(windowName + "完成为第" + serviceNumber + "号普通客户服务,总共耗时" + serviceTime/1000 + "");       

        }else{ 

            System.out.println(windowName + "没有取到普通任务,正在空闲一秒");      

            try { 

                Thread.sleep(1000); 

            } catch (InterruptedException e) { 

                e.printStackTrace(); 

            }                

        } 

    }      

    private void expressService(){ 

        Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber(); 

        String windowName = "" + number + "" + type + "窗口";    

        System.out.println(windowName + "开始获取快速任务!");        

        if(serviceNumber !=null){ 

            System.out.println(windowName + "开始为第" + serviceNumber + "号快速客户服务");             

            int serviceTime = Constants.MIN_SERVICE_TIME; 

            try { 

                Thread.sleep(serviceTime); 

            } catch (InterruptedException e) { 

                e.printStackTrace(); 

            }        

            System.out.println(windowName + "完成为第" + serviceNumber + "号快速客户服务,总共耗时" + serviceTime/1000 + "");       

        }else{ 

            System.out.println(windowName + "没有取到快速任务!");                

            commonService(); 

        } 

    }      

    private void vipService(){ 

 

        Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber(); 

        String windowName = "" + number + "" + type + "窗口";    

        System.out.println(windowName + "开始获取VIP任务!");           

        if(serviceNumber !=null){ 

            System.out.println(windowName + "开始为第" + serviceNumber + "VIP客户服务");            

            int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; 

            int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME; 

            try { 

                Thread.sleep(serviceTime); 

            } catch (InterruptedException e) { 

                e.printStackTrace(); 

            }        

            System.out.println(windowName + "完成为第" + serviceNumber + "VIP客户服务,总共耗时" + serviceTime/1000 + "");      

        }else{ 

            System.out.println(windowName + "没有取到VIP任务!");               

            commonService(); 

        }    

    } 

package cn.itcast.bankqueue;  

import java.util.concurrent.Executors; 

import java.util.concurrent.TimeUnit; 

import java.util.logging.Logger;  

public class MainClass {      

    private static Logger logger = Logger.getLogger("cn.itcast.bankqueue"); 

    public static void main(String[] args) { 

        //创建普通窗口  

        for(int i=1;i<5;i++){ 

            ServiceWindow window =  new ServiceWindow(); 

            window.setNumber(i); 

            window.start(); 

        } 

        //创建快速窗口  

        ServiceWindow expressWindow =  new ServiceWindow(); 

        expressWindow.setType(CustomerType.EXPRESS); 

        expressWindow.start();          

        //创建VIP窗口       

        ServiceWindow vipWindow =  new ServiceWindow(); 

        vipWindow.setType(CustomerType.VIP); 

        vipWindow.start();             

        //普通客户获取编号 

        Executors.newScheduledThreadPool(1).scheduleAtFixedRate( 

                new Runnable(){ 

                    public void run(){ 

                        Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewNumber(); 

                        System.out.println("" + serviceNumber + "号普通客户正在等待服务!");                        

                    } 

                }, 

                0, 

                Constants.COMMON_CUSTOMER_INTERVAL_TIME,  

                TimeUnit.SECONDS); 

         

        //快速客户获取编号  

        Executors.newScheduledThreadPool(1).scheduleAtFixedRate( 

                new Runnable(){ 

                    public void run(){ 

                        Integer serviceNumber = NumberMachine.getInstance().getExpressManager().generateNewNumber(); 

                        System.out.println("" + serviceNumber + "号快速客户正在等待服务!"); 

                    } 

                }, 

                0, 

                Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2,  

                TimeUnit.SECONDS); 

         

        //VIP客户拿号  

        Executors.newScheduledThreadPool(1).scheduleAtFixedRate( 

                new Runnable(){ 

                    public void run(){ 

                        Integer serviceNumber = NumberMachine.getInstance().getVipManager().generateNewNumber(); 

                        System.out.println("" + serviceNumber + "VIP客户正在等待服务!"); 

                    } 

                }, 

                0, 

                Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6,  

                TimeUnit.SECONDS); 

    } 

 

0 0
原创粉丝点击