黑马程序员_java 银行业务调度系统


 1.面向对象的分析与设计

         ·本例中有三种类型的客户:普通客户,快速客户,VIP客户,要异步随机生成各种类型的客户,各种类型的

客户在其对应的窗口按顺序依次办理业务。由于有三类客户,每类客户的号码编排都是独立的,所以要产生

三个号码管理器,各自管理一类用户的排队号码。这三个号码管理器对象统一由一个号码机器进行管理,这

个号码机器在整个系统中始终只能有一个,所以,它要被设计成单例。

2.类图


3.类的设计

       ·NumberManager类

<1>定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。

                            privateList<Integer>queueNumbers=new ArrayList<Integer>();

<2>定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相

同的数据,所以要进行同步.

                                     //产生号码

           public synchronized IntegergenerateNumber(){

              queueNumbers.add(lastNumber);

              returnlastNumber++;

           }

           //获取号码

           public synchronized IntegerfetchNumber(){

              if(queueNumbers.size()>0)

                  returnqueueNumbers.remove(0);

              else {

                  returnnull;

              }

           }

       ·NumberMachine类

                   <1>定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,

                      定义三个对应的方法来返回这三个NumberManager对象。

                                     privateNumberManagercommonManager=newNumberManager();

               privateNumberManagerexpressManager=newNumberManager();

               privateNumberManagervipManager=newNumberManager();

               publicNumberManagergetCommonManager(){

                  returncommonManager;

               }

               publicNumberManagergetExpressManager() {

                  returnexpressManager;

               }

               publicNumberManagergetVipManager() {

                  returnvipManager;

               }

                <2>由于只能有一个号码管机器所以要将NumberMachine类设计成单例。

                            publicclass NumberMachine {

           //保证对象的单一

               private NumberMachine(){}

               privatestatic NumberMachineinstance=new NumberMachine();

               public static NumberMachinegetInstance(){

                  returninstance;

               }

}

       ·CustomerType类

                   <1>系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。

                            COMMON,EXPRESS,VIP;

                <2>重写toString方法,返回类型的中文名称。

                                     public String toString(){

              String name= null;

              switch(this){

              caseCOMMON:

                  name = "普通";

                  break;

              caseEXPRESS:

                  name = "快速";

                  break;

              caseVIP:

                  return name();

              }

              return name;

           }

       ·ServiceWindow类

                 <1>定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。

                             publicvoid start(){

              Executors.newSingleThreadExecutor().execute(new Runnable(){

                  publicvoid run(){

                     while(true){

                         switch(type){

                         caseCOMMON:

                            commonService();

                            break;

                         caseEXPRESS:

                             expressService();

                             break;

                         caseVIP:

                            vipService();

                            break;

                         }

                     }

                  }

              });

           }

                <2>定义三个方法分别对三种客户进行服务.

private void commonService(){

           }  

private void expressService(){

           }

private void vipService(){

           }  

       ·MainClass类      

<1>用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。

                   //创建普通窗口

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

           ServiceWindow Commonwindow=new ServiceWindow();

           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();

<2>接着再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码。

                            Executors.newScheduledThreadPool(1).scheduleAtFixedRate(

                     new Runnable(){

                         publicvoid run(){

Integer number=NumberMachine.getInstance().getCommonManager().generateNumber();

                    

                  }

              },

              0,

              Constant.COMMON_CUSTOMER_INTERVAL_TIME,

              TimeUnit.SECONDS);

       ·Constants 类

                定义三个常量:最大服务时间:MAX_SERVICE_TIME

                                            最小服务时间:MIN_SERVICE_TIME

                                            产生普通客户间隔时间:COMMON_CUSTOMER_INTERVAL_TIME

 


---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java进程调度的设计和实现可以参考操作系统中的进程调度算法,例如先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)等。 下面是一个简单的Java程序,模拟时间片轮转算法的进程调度过程: ```java import java.util.LinkedList; import java.util.Queue; public class ProcessScheduler { private Queue<Process> readyQueue; private int quantum; public ProcessScheduler(int quantum) { this.readyQueue = new LinkedList<>(); this.quantum = quantum; } public void addProcess(Process process) { readyQueue.add(process); } public void run() { int time = 0; while (!readyQueue.isEmpty()) { Process process = readyQueue.poll(); int remainingTime = process.execute(quantum); time += quantum; if (remainingTime > 0) { process.setArrivalTime(time); readyQueue.add(process); } } } public static void main(String[] args) { ProcessScheduler scheduler = new ProcessScheduler(10); scheduler.addProcess(new Process("P1", 30)); scheduler.addProcess(new Process("P2", 20)); scheduler.addProcess(new Process("P3", 10)); scheduler.run(); } } class Process { private String name; private int burstTime; private int arrivalTime; public Process(String name, int burstTime) { this.name = name; this.burstTime = burstTime; } public int execute(int quantum) { if (burstTime <= quantum) { System.out.println(name + " executed for " + burstTime + "ms"); return 0; } else { System.out.println(name + " executed for " + quantum + "ms"); burstTime -= quantum; return burstTime; } } public void setArrivalTime(int time) { arrivalTime = time; } } ``` 在上面的程序中,`ProcessScheduler`类表示进程调度器,根据构造函数设置时间片的长度,`addProcess`方法添加需要执行的进程。`run`方法模拟时间片轮转的调度过程,每次从就绪队列中取出一个进程执行,如果该进程执行完毕,则从队列中移除,否则将该进程放回队列末尾,并更新其到达时间。 `Process`类表示进程,构造函数中传入进程名称和执行时间,`execute`方法模拟进程执行,如果该进程执行完毕,则返回0,否则返回剩余执行时间。`setArrivalTime`方法用于更新进程的到达时间。 在`main`方法中,创建一个时间片长度为10的进程调度器,添加3个进程,然后运行该调度器。 以上代码只是一个简单的示例,实际的进程调度算法会更加复杂,需要考虑进程的优先级、等待时间、响应时间等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值