银行业务调度系统

Posted on 2014-01-14 20:03  我是王琦  阅读(334)  评论(0)    收藏  举报

 

银行业务调度系统

在银行业务调度系统中,每一个客户相当于一个号码;每进来一个客户就生成一个号码,每服务一个客户窗口就取一个号码;

所以可以用一个号码管理器来管理号码的生成与取出,建立一个号码管理器的类,提供生成号码和取出号码的方法,每生成一个号码就把它装进集合中,每取一个号码就将它从集合中取出第一个元素。

在整个系统中有三种服务类型,普通客户服务,快速客户服务,和VIP客户服务,它们分别在对应的服务窗口服务。所以要三个号码管理器,分别对这三种客户进行管理,用一个号码机器统一管理这三个号码管理器。整个系统张号码机器只有一个可以设计成单利,对外分别提供获取这三个号码管理器的方法。

服务窗口类,对外提供开始服务的方法,因为每种服务是独立运行的,所以要在该方法中创建线程,判断是什么客户类型即调用什么服务方法。

客户类型是固定的所以可用枚举表示

建立一个住方法,创建相应的窗口对象指定服务类型,调用窗口开始运行的方法。

创建三个定时器,按照比例随机的产生普通客户,快速客户,VIP客户。

 

用枚举表示三种客户类型

package com.itheima.bank;
/*
三种客户类型用枚举表示
*/
public enum Customer { COMMON,QUIET,VIP; public String toString(){ switch(this){ case COMMON: return "普通"; case QUIET: return "快速"; case VIP: return "VIP"; } return null; } }

服务窗口以及应的服务

package com.itheima.bank;

import java.util.Random;
import java.util.concurrent.Executors;

/*
 * 服务窗口为客户进行服务
 * 实际上时窗口在调用对应的号码管理器对象叫号的过程。
 * 每个窗口可以设置服务类型,即该设置该窗口为什么样的客户进行服务。
 * 客户类型只有三种可以用枚举进行标示
 *
 * */
public class serviceWindow {
    
    private int windowId=1;
    //服务类型
    private Customer type=Customer.COMMON;
    public void setWindowId(int windowId) {
        this.windowId = windowId;
    }
    public void setType(Customer type) {
        this.type = type;
    }
    public void start(){
        Executors.newSingleThreadExecutor().execute(new Runnable(){
            /* (non-Javadoc)
             * @see java.lang.Runnable#run()
             */
            @Override
            public void run() {
                while(true){
                    switch(type){
                    case COMMON:
                        commonService();
                        break;
                    case QUIET:
                        quietService();
                        break;
                    case VIP:
                        vipService();
                        break;
                    }
                }
                
            }
        });
    }
    protected void vipService() {
        String windowName="第"+windowId+type+"窗口";
        NumberManger numberManger=NumberMachine.getInstance().getCommonManger();
        Integer number=numberManger.getNumber();
        if(number!=null){
            
            //System.out.println(windowName+"正在为第"+number+"号"+"VIP客户服务");
            long begTime=System.currentTimeMillis();
            try {
                Thread.sleep((new Random().nextInt(10)+1)*1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            long endTime=System.currentTimeMillis();
            System.out.println(windowName+"为第"+number+"号"+"VIP客户服务完成"+",耗时"+(endTime-begTime)/1000+"s");
            
        }else{
            //System.out.println(windowName+"没有取到任务,,休息1s");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            commonService();
        }
    }
    
    protected void quietService() {
        String windowName="第"+windowId+type+"窗口";
        NumberManger numberManger=NumberMachine.getInstance().getCommonManger();
        Integer number=numberManger.getNumber();
        //System.out.println(windowName+"正在获取任务");
        if(number!=null){
            
            //System.out.println(windowName+"正在为第"+number+"号"+"快速客户服务");
            long begTime=System.currentTimeMillis();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            long endTime=System.currentTimeMillis();
            System.out.println(windowName+"为第"+number+"号"+"快速客户服务完成"+",耗时"+(endTime-begTime)/1000+"s");
            
            
        }else{
            //System.out.println(windowName+"没有取到任务,休息1s");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            commonService();
        }
        
    }
    public void commonService() {
        String windowName="第"+windowId+type+"窗口";
        NumberManger numberManger=NumberMachine.getInstance().getCommonManger();
        Integer number=numberManger.getNumber();
        if(number!=null){
            
            //System.out.println(windowName+"正在为第"+number+"号"+"普通客户服务");
            long begTime=System.currentTimeMillis();
            try {
                Thread.sleep((new Random().nextInt(10)+1)*1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            long endTime=System.currentTimeMillis();
            System.out.println(windowName+"为第"+number+"号"+"普通客户服务完成"+",耗时"+(endTime-begTime)/1000+"s");
            
        }else{
            //System.out.println(windowName+"没有取到任务,休息1s");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
package com.itheima.bank;

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

public class MainClass {
    public static void main(String[] args) {
        for(int i=1;i<=5;i++){
            
            serviceWindow commonWindow=new serviceWindow();
            commonWindow.setWindowId(i);
            commonWindow.setType(Customer.COMMON);
            commonWindow.start();
        }
        
        serviceWindow vipWindow=new serviceWindow();
        vipWindow.setType(Customer.VIP);
        vipWindow.start();
        
        serviceWindow quietWindow=new serviceWindow();
        quietWindow.setType(Customer.QUIET);
        quietWindow.start();
        
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
                
                new Runnable(){
                    @Override
                    public void run() {
                        Integer number=NumberMachine.getInstance().getQuietManger().creatNumber();
                        System.out.println("第"+number+"快速客户等待服务");
                    }
                }, 
                0, 
                3, 
                TimeUnit.SECONDS);
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
                
                new Runnable(){
                    @Override
                    public void run() {
                        Integer number=NumberMachine.getInstance().getVipManger().creatNumber();
                        System.out.println("第"+number+"号VIP客户等待服务");
                    }
                }, 
                0, 
                6, 
                TimeUnit.SECONDS);
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
        
        new Runnable(){
            @Override
            public void run() {
                Integer number=NumberMachine.getInstance().getCommonManger().creatNumber();
                System.out.println("第"+number+"普通客户等待服务");
            }
        }, 
        0, 
        1, 
        TimeUnit.SECONDS);

    
    }
}


号码机器对号码管理器进行管理

 

package com.itheima.bank;
/*
 * 号码机器,用于管理号码管理器
 * 该系统中需要三个号码管理器分别对应普通窗口,快速窗口,VIP窗口。
 * 各窗口调用自己的号码管理器对象取叫号。
 * 在整个系统中号码管理器只有一个所以可以设计成单利
 * 
 * */
public class NumberMachine {
    
    private NumberMachine(){}
    private final static NumberMachine numberMachine=new NumberMachine();
    
    public static NumberMachine getInstance() {
        return numberMachine;
    }
    
    private final static NumberManger commonManger=new NumberManger();
    public NumberManger getCommonManger(){
        return commonManger;
    }
    
    private final static NumberManger vipManger=new NumberManger();
    public NumberManger getVipManger(){
        return vipManger;
    }
    
    private final static NumberManger quietManger=new NumberManger();
    public NumberManger getQuietManger(){
        return quietManger;
    }
    
    
    

}

 

package com.itheima.bank;

import java.util.ArrayList;

/*
 * 号码管理器用于生成号码,取出号码。
 * 窗口为客户服务就是窗口调用对应的号码管理器叫号的过程。
 * */
public class NumberManger {
    
    //定义集合用于存储号码管理器生成的号码
    private ArrayList<Integer> numbers=new ArrayList<Integer>();
    int num=1;
    public Integer creatNumber(){
        numbers.add(num);
        return num++;
    }
    //获取号码的方法,从集合中取出第一个元素
    public synchronized Integer getNumber(){
        Integer number=null;
        if(numbers.size()>0){
             number=numbers.remove(0);
            
        }
         return number;
    }
    
    
}






---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3