黑马程序员技术交流社区

标题: 张孝祥老师讲的java银行业务调度系统个人技术摘要 [打印本页]

作者: 王永杰    时间: 2012-9-8 15:41
标题: 张孝祥老师讲的java银行业务调度系统个人技术摘要
本帖最后由 王永杰 于 2012-9-8 16:40 编辑

下面内容是我对银行业务调度系统的具体实践编辑的代码其中肯定会有很多不足,跟不合理的地方,但是大意是跟张老师的源码一样的。我希望大家看了能提出意见。我一定会及时更正。

==================================业务需求 ========================================


模拟实现银行业务调度系统逻辑,具体需求如下:
    1、银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
    2、有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
    3、异步随机生成各种类型的客户,生成各类型用户的概率比例为:
        VIP客户:普通客户:快速客户  =  16 3
    4、客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办      理业务所需
         时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
    5、各类型客户在其对应窗口按顺序依次办理业务。
    6、当VIP6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对      应的客户等
         待办理业务的时候,则优先处理对应客户的业务。
    7、随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
    8、不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。


类机构图


下面是我帖子的内容,我打包放这里了。希望能帮助到更多的人。

张孝祥java银行业务调度系统视频教程学习个人总结.rar

40.46 KB, 下载次数: 202


作者: 王永杰    时间: 2012-9-8 15:42
==================================具体业务代码 =====================================

编写表示号码管理器的类

package cn.test.bank;



import java.awt.List;

import java.util.ArrayList;



/**

* 号码发送器

* @author Administrator

*

*/

public class NumberManager {



private  int lastNumber = 1;

private ArrayList<Integer> queueNumber = new ArrayList<Integer>();



public synchronized Integer generateNewManager(){

  queueNumber.add(lastNumber);

  return  lastNumber++;

}



    public synchronized Integer fetchServiceNumber(){

     Integer number = null;

     if (queueNumber.size()>0) {

      number = queueNumber.remove(0);

  }

     return number;

    }

}

编写表示号码机器的类
package cn.test.bank;

public class NumberMachine {

private NumberManager  conmmonManager = new NumberManager();
private NumberManager  expressManager = new NumberManager();
private NumberManager  vipManager = new NumberManager();

public NumberManager getConmmonManager() {
  return conmmonManager;
}
public NumberManager getExpressManager() {
  return expressManager;
}
public NumberManager getVipManager() {
  return vipManager;
}

private NumberMachine(){}
public static NumberMachine getInMachine(){
  return instance;
}
private static NumberMachine instance = new NumberMachine();
}
作者: 王永杰    时间: 2012-9-8 15:42
编写表示业务窗口的类的骨架代码
package cn.test.bank;

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

public class ServiceWindow {
private CustomerType type = CustomerType.COMMON;

public void setType(CustomerType type) {
  this.type = type;
}
public void setWindowId(int windowId) {
  this.windowId = windowId;
}
private int windowId = 1;

public void start(){
  Executors.newSingleThreadExecutor().execute(new Runnable() {
   
   public void run() {
    // TODO Auto-generated method stub
    while(true){
      switch (type) {
    case COMMON:
     commonService();
     break;
    case EXPRESS:
        expressService();
     break;
    case VIP:
       vipService();
       break;
    default:
     break;
    }
     }
   
   }
  });
  
}

private void commonService(){
  String windowNameString = "第"+windowId +"号"+type+"窗口";
  
  Integer number = NumberMachine.getInMachine().getConmmonManager().fetchServiceNumber();
  System.out.println(windowNameString + "正在获取任务");
  if (number != null) {
   System.out.println(windowNameString +"为第"+number+"个"+"普通"+"客户服务!");
     long  beginTime =  System.currentTimeMillis();
     int maxRand = Constants.MAX_SERVICE_TLME - Constants.MIN_SERVICE_TLME;
     long serveTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TLME;
     try {
    Thread.sleep(serveTime);
   } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
   }
   long  costTime =  System.currentTimeMillis()-beginTime;
    System.out.println(windowNameString +"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");
  }else {
   System.out.println(windowNameString + "没有取到任务,先休息1秒钟");
   try {
    Thread.sleep(1000);
   } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
   }
  }
}
private void expressService(){
  String windowNameString = "第"+windowId +"号"+type+"窗口";
  
  Integer number = NumberMachine.getInMachine().getExpressManager().fetchServiceNumber();
  System.out.println(windowNameString + "正在获取任务");
  if (number != null) {
   System.out.println(windowNameString +"为第"+number+"个"+type+"客户服务!");
     long  beginTime =  System.currentTimeMillis();
    // int maxRand = Constants.MAX_SERVICE_TLME - Constants.MIN_SERVICE_TLME;
    // long serveTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TLME;
     try {
    Thread.sleep(Constants.MIN_SERVICE_TLME);
   } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
   }
   long  costTime =  System.currentTimeMillis()-beginTime;
    System.out.println(windowNameString +"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");
  }else {
   System.out.println(windowNameString + "没有取到任务!");
   commonService();
  }
}
private void vipService(){
  String windowNameString = "第"+windowId +"号"+type+"窗口";
  
  Integer number = NumberMachine.getInMachine().getVipManager().fetchServiceNumber();
  System.out.println(windowNameString+"正在获取任务");
  if (number != null) {
     System.out.println(windowNameString +"为第"+number+"个"+type+"客户服务!");
     long  beginTime =  System.currentTimeMillis();
     int maxRand = Constants.MAX_SERVICE_TLME - Constants.MIN_SERVICE_TLME;
     long serveTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TLME;
     try {
    Thread.sleep(serveTime);
   } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
   }
   long  costTime =  System.currentTimeMillis()-beginTime;
    System.out.println(windowNameString +"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");
  }else {
   System.out.println(windowNameString + "没有取到任务!");
   commonService();
  }
}
}

作者: 王永杰    时间: 2012-9-8 15:43
完成表示业务窗口的类的细节代码
package cn.test.bank;

public enum CustomerType {
  COMMON,EXPRESS,VIP;
  public String tosString(){
   
  switch (this) {
  case COMMON:
   return  "普通";
  case EXPRESS:
   return  "快速";
  case VIP:
   return  name();
  }
   return null;
  }
}

-----------------------------------------------------------------------------------
package cn.test.bank;

public class Constants {
public static int MAX_SERVICE_TLME = 10000;
public static int MIN_SERVICE_TLME = 1000;
public static int COMMON_CUSTOMER_INTERVAL_TLME = 1;

}

编写程序的主类和完成客户取号功能
package cn.test.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 commonWindows = new ServiceWindow();
   commonWindows.setWindowId(i);
   commonWindows.start();

  }
  ServiceWindow  expressWindow = new ServiceWindow();
        expressWindow.setType(CustomerType.EXPRESS);
        expressWindow.start();
        
        ServiceWindow vipWindow = new ServiceWindow();
        vipWindow.setType(CustomerType.VIP);
        vipWindow.start();
        
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
          new Runnable() {
     
     public void run() {
      // TODO Auto-generated method stub
      Integer number =NumberMachine.getInMachine().getConmmonManager().generateNewManager();
      System.out.println(number+"号普通客户等待服务!");
     }},0,Constants.COMMON_CUSTOMER_INTERVAL_TLME,TimeUnit.SECONDS
         
        );
        
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
          new Runnable() {
     
     public void run() {
      // TODO Auto-generated method stub
      Integer number =NumberMachine.getInMachine().getExpressManager().generateNewManager();
      System.out.println(number+"号快速客户等待服务!");
     }},0,Constants.COMMON_CUSTOMER_INTERVAL_TLME*6,TimeUnit.SECONDS
         
        );
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
          new Runnable() {
     
     public void run() {
      // TODO Auto-generated method stub
      Integer number =NumberMachine.getInMachine().getVipManager().generateNewManager();
      System.out.println(number+"号VIP客户等待服务!");
     }},0,Constants.COMMON_CUSTOMER_INTERVAL_TLME*2,TimeUnit.SECONDS
         
        );
}
}

作者: 王永杰    时间: 2012-9-8 15:44
==================================测试结果 ========================================


第1号EXPRESS窗口正在获取任务

第1号EXPRESS窗口没有取到任务!

第1号EXPRESS窗口正在获取任务

第1号EXPRESS窗口没有取到任务,先休息1秒钟

第4号COMMON窗口正在获取任务

第1号VIP窗口正在获取任务

第4号COMMON窗口没有取到任务,先休息1秒钟

第1号COMMON窗口正在获取任务

第3号COMMON窗口正在获取任务

第2号COMMON窗口正在获取任务

第3号COMMON窗口没有取到任务,先休息1秒钟

第1号COMMON窗口没有取到任务,先休息1秒钟

第1号VIP窗口没有取到任务!

第2号COMMON窗口没有取到任务,先休息1秒钟

第1号VIP窗口正在获取任务

第1号VIP窗口没有取到任务,先休息1秒钟

1号普通客户等待服务!

1号快速客户等待服务!

1号VIP客户等待服务!

第1号EXPRESS窗口正在获取任务

第1号EXPRESS窗口为第1个EXPRESS客户服务!

第4号COMMON窗口正在获取任务

第4号COMMON窗口为第1个普通客户服务!

第2号COMMON窗口正在获取任务

第2号COMMON窗口没有取到任务,先休息1秒钟

第3号COMMON窗口正在获取任务

第3号COMMON窗口没有取到任务,先休息1秒钟

第1号COMMON窗口正在获取任务

第1号COMMON窗口没有取到任务,先休息1秒钟

第1号VIP窗口正在获取任务

第1号VIP窗口为第1个VIP客户服务!

2号普通客户等待服务!

第1号EXPRESS窗口为第1个EXPRESS客户完成服务,耗时1秒

第1号EXPRESS窗口正在获取任务

第1号EXPRESS窗口没有取到任务!

第1号EXPRESS窗口正在获取任务

第1号EXPRESS窗口为第2个普通客户服务!

第1号COMMON窗口正在获取任务

第3号COMMON窗口正在获取任务

第2号COMMON窗口正在获取任务

第3号COMMON窗口没有取到任务,先休息1秒钟

第1号COMMON窗口没有取到任务,先休息1秒钟

第2号COMMON窗口没有取到任务,先休息1秒钟

3号普通客户等待服务!

2号VIP客户等待服务!

第3号COMMON窗口正在获取任务

第3号COMMON窗口为第3个普通客户服务!

第1号COMMON窗口正在获取任务

第2号COMMON窗口正在获取任务

第1号COMMON窗口没有取到任务,先休息1秒钟

第2号COMMON窗口没有取到任务,先休息1秒钟

4号普通客户等待服务!

第2号COMMON窗口正在获取任务

第1号COMMON窗口正在获取任务

第1号COMMON窗口没有取到任务,先休息1秒钟

第2号COMMON窗口为第4个普通客户服务!

5号普通客户等待服务!

3号VIP客户等待服务!

第1号COMMON窗口正在获取任务

第1号COMMON窗口为第5个普通客户服务!

6号普通客户等待服务!

第1号VIP窗口为第1个VIP客户完成服务,耗时4秒

第1号VIP窗口正在获取任务

第1号VIP窗口为第2个VIP客户服务!

第2号COMMON窗口为第4个COMMON客户完成服务,耗时1秒

第2号COMMON窗口正在获取任务

第2号COMMON窗口为第6个普通客户服务!

7号普通客户等待服务!

第3号COMMON窗口为第3个COMMON客户完成服务,耗时3秒

第3号COMMON窗口正在获取任务

第3号COMMON窗口为第7个普通客户服务!

2号快速客户等待服务!

4号VIP客户等待服务!

第4号COMMON窗口为第1个COMMON客户完成服务,耗时5秒

第4号COMMON窗口正在获取任务

第4号COMMON窗口没有取到任务,先休息1秒钟

8号普通客户等待服务!

第2号COMMON窗口为第6个COMMON客户完成服务,耗时2秒

第2号COMMON窗口正在获取任务

第2号COMMON窗口为第8个普通客户服务!

第4号COMMON窗口正在获取任务

第4号COMMON窗口没有取到任务,先休息1秒钟

9号普通客户等待服务!

5号VIP客户等待服务!
作者: 子龍    时间: 2012-9-13 18:14
怎么 都是你在分享这些啊!还好你给分享了,不过我还想要些张老师的PPT 你这里有吗?
作者: 王永杰    时间: 2012-9-13 18:45
应该是你看的少吧,当然我也看的少,估计有人也分享过类似的了。是我们不知道而已。
作者: 王永杰    时间: 2012-9-13 18:45
子龍 发表于 2012-9-13 18:14
怎么 都是你在分享这些啊!还好你给分享了,不过我还想要些张老师的PPT 你这里有吗? ...


应该是你看的少吧,当然我也看的少,估计有人也分享过类似的了。是我们不知道而已。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2