您的位置:首页 > 其它

张孝祥老师银行系统案例

2014-05-23 14:57 330 查看
package yinghangxitong;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
 

public class MainClass {  
 
    /**
     * @author chenzhiyuan
     */  
    
// 用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。
//接着在创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码
    
    public static void main(String[] args) {  
      
        for(int i=1;i<5;i++){  
        //新建四个普通窗口,模拟普通窗口  
        ServiceWindow commonwindow=new ServiceWindow();  
        //设定指定窗口的ID  
        commonwindow.setWindowid(i);  
        commonwindow.start();  
        }  
        //新建一个vip窗口  
        ServiceWindow vipwindow=new ServiceWindow();  
        vipwindow.setType(CustomerType.VIP);  
        vipwindow.start();  
        //快速窗口  
        ServiceWindow expresswindow=new ServiceWindow();  
        expresswindow.setType(CustomerType.EXPRESS);  
        expresswindow.start();  
        //开启三个线程,模拟三个窗口  
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {  
              
            @Override  
            public void run() {  
                //产生模拟的新客户  
             Integer number=NumberMachine.getInstance().getExpressManager().generateNewManager();  
             System.out.println("第"+number+"号快速客户在等待服务");  
            }  
        },  
                0,  
                Constants.COMMON_CUSTOMER_Time*2,   //执行间隔  
            TimeUnit.SECONDS);  
    Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {  
          
        @Override  
        public void run() {  
         Integer number=NumberMachine.getInstance().getVipManager().generateNewManager();  
         System.out.println("第"+number+"号VIP客户在等待服务");  
        }  
    },  
            0,  
            Constants.COMMON_CUSTOMER_Time*6,  
        TimeUnit.SECONDS);  
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {  
          
        @Override  
        public void run() {  
       Integer number=NumberMachine.getInstance().getCommonManager().generateNewManager();  
             System.out.println("第"+number+"号普通客户在等待服务");  
              
        }  
    },  
            0,  
            Constants.COMMON_CUSTOMER_Time,  
        TimeUnit.SECONDS);  
    }  
 



package yinghangxitong;

import java.util.ArrayList;  
import java.util.List;  

/**
 * @author chenzhiyuan
 */  

//定义用户存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合
//定义个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。

//号码机器对象,负责产生客户  
public class NumberManager {  
    private int lastNumber=0;  
    //排队序列  
    private List<Integer> queueNumber=new ArrayList<Integer>();  
    //每次产生一个人加入到list中,现在是第lastNumber为客户开始服务  
    public synchronized int generateNewManager(){  
        queueNumber.add(++lastNumber);  
        return lastNumber;  
    }  
    //取号码  
    public synchronized Integer fetchServiceNumber(){  
        if(queueNumber.size()>0){  
            return (Integer)queueNumber.remove(0);  
        }else{  
            return null;  
        }  
    }  
 
}  
 

package yinghangxitong;

/**
 * @author chenzhiyuan
 */  

//定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法
//来返回这三个NumberManager对象将NumberMachine类设计成单例。

public class NumberMachine {
    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 yinghangxitong;

/**
 * @author chenzhiyuan
 */  
 //系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
 //重写toString方法,返回类型的中文名称。这是在后面编写代码时重构出来的,刚开始不用考虑

//CustomerType枚举类
//枚举类型,覆写toStirng()方法  
public enum CustomerType {
    COMMON, EXPRESS, VIP;
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        switch (this) {
        case COMMON:
            return "普通";
        case EXPRESS:
            return "快速";
        case VIP:
            return name();
        }
        return null;
    }

}

package yinghangxitong;

import java.util.Random;  
import java.util.concurrent.Executors;  
 
/**
 * @author chenzhiyuan
 */  

// 定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法
// 定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息
//ServiceWindow类
//窗口依次叫号  
public class ServiceWindow {  
    private int windowNum=1;  
    public void setWindowid(int windowid) {  
        this.windowNum = windowid;  
    }  
    public void setType(CustomerType type) {  
        this.type = type;  
    }  
    //根据类型的不同进行叫号  
    private CustomerType type=CustomerType.COMMON;  
    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="第"+windowNum+"号"+type+"窗口";  
            System.out.println(windowName+"正在获取普通任务");  
            //取票  
            Integer serviceNum=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();  
            if(serviceNum!=null){  
                System.out.println(windowName+"开始为第"+serviceNum+"号普通客户服务");  
                int maxRand=Constants.MAX_SERVICE_TIME - Constants.Min_SERVICE_TIME;//最大的服务时间  
                int serveTime=new Random().nextInt(maxRand)+1+Constants.Min_SERVICE_TIME;  
                try {  
                    Thread.sleep(serveTime);  
                } catch (InterruptedException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
                  
                System.out.println(windowName+"完成为第"+serviceNum+"号普通客户服务,总共耗时"  
                                             +serveTime/1000+"秒");  
            }  
            else{  
                System.out.println(windowName+"没有取得普通任务,正在空闲一秒");  
                try {  
                    Thread.sleep(1000);  
                } catch (InterruptedException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
            }  
        }  
        //快速窗口  
        private void expressService() {  
            //产生客户的实例,  
            Integer serviceNum=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();  
            String windowName="第"+windowNum+"号"+type+"窗口";  
            System.out.println(windowName+"开始获取快速任务");  
            if(serviceNum!=null){  
                System.out.println(windowName+"开始为第"+serviceNum+"号快速客户服务");  
                int serviceTime=Constants.Min_SERVICE_TIME;  
                try {  
                    Thread.sleep(serviceTime);  
                } catch (InterruptedException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
                System.out.println(windowName+"完成为第"+serviceNum+"号快速客户服务,总共耗时"+  
      serviceTime/1000+"秒");  
            }  
            else{  
                System.out.println(windowName+"没有取到快速任务");  
                //没有任务时,为普通客户服务  
                commonService();  
          
            }  
        }  
        private void vipService() {  
            String windowName="第"+windowNum+"号"+type+"窗口";  
            System.out.println(windowName+"正在开始获取VIP任务");  
            Integer serviceNum=NumberMachine.getInstance().getVipManager().fetchServiceNumber();  
            if(serviceNum!=null){  
                System.out.println(windowName+"开始为第"+serviceNum+"号VIP客户服务");  
                int maxRand=Constants.MAX_SERVICE_TIME-Constants.Min_SERVICE_TIME;//最大的服务时间  
                int serveTime=new Random().nextInt(maxRand)+1+Constants.Min_SERVICE_TIME;  
                try {  
                    Thread.sleep(serveTime);  
                } catch (InterruptedException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
                  
              System.out.println(windowName+"完成为第"+serviceNum+"号VIP客户服务,总共耗时"+  
                                         serveTime/1000+"秒");  
            }  
            else{  
                System.out.println(windowName+"没有取到VIP任务!");//传递此时的type,  
  //所以执行commonService()时还是VIP格式类型还是--->第1号VIP窗口开始为第5号普通客户服务  
                commonService();  
                  
            }  
        }  
      
    }  
 

package yinghangxitong;

public class Constants {
    /**
     * @author chenzhiyuan
     */
    // 定义三个常量:MAX_SERVICE_TIME, MIN_SERVICE_TIME, COMMON_CUSTOMER_INTEGVAL_TIME,
    // 经常用到的常量
    public static int MAX_SERVICE_TIME = 10000;
    public static int Min_SERVICE_TIME = 1000;
    public static int COMMON_CUSTOMER_Time = 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: