银行系统面试题

这部分学习给我的第一感觉就是程序设计方面,对于业务逻辑的理解难于具体代码的编写。对于这个交通信号等系统如果我有开车的经验那就容易多了,我基本是个车盲,也从来没仔细观察过交通信号灯。

改天仔细去路口看看再做,我先做银行调度系统吧。毕竟比较熟。

 

 

不过一不小心做出来了,也不知道是不是符合说明的要求。

 

银行系统,先实现生成客户的功能

 

public class Bank {

 

      

       public static void main(String[] args) {

              new gate().run();

       }

 

}

 

class client{//封装用户对象,带有用户类型和办理业务所需时间(随机生成)

       int type = 0;//0vip用户,1为普通用户,2为快速用户

       int time = 0;//办理业务时间最大为10,最小为1

        client(){

              int i = (int) (Math.random()*10);

              if(i==0){type = 0;}

              if(i>0&i<7){type = 1;}

              if(i>6){type = 2;}//按给定概率生成客户对象

              if(type == 2){//如果是快速客户,则办理业务时间为最短

                     this.time = 1;

              }else this.time = (((int)(Math.random()*10))+1);

        }

       public int gettype() {

              return type;

       }

       public int gettime() {

              return time;

       }

}

 

class gate extends Thread { //我计划分6个线程分别产生用户对象,用户从门进来么所以用gate做类名。

       public void run() {

              while(true){

                     try {

                            sleep(500);

                     } catch (InterruptedException e) {

                            e.printStackTrace();

                     }

                     if(((int)(Math.random()*2))==1){

                            client c = new client();

                            int type = c.gettype();

                            int time = c.gettime();

                            System.out.println("新增客户"+type+" "+time);

                            }else{

                                   System.out.println("没有产生客户");

                            }

                     }//500毫秒有50%的概率创建一个用户

              }

       }

 

运行结果相当满意,

没有产生客户

新增客户1 7

没有产生客户

没有产生客户

新增客户1 1

新增客户1 9

没有产生客户

没有产生客户

没有产生客户

没有产生客户

没有产生客户

新增客户2 1

新增客户1 7

没有产生客户

新增客户1 9

没有产生客户

新增客户1 3

没有产生客户

新增客户0 2

没有产生客户

没有产生客户

没有产生客户

新增客户1 6

 

感觉有点不对劲,原来调用的是gaterun方法,而没有调用start启动线程。稍稍改动一下再试试

public static void main(String[] args) {

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

           new gate().start();

           System.out.println(i+"号门开始接待客户");

           }

    }

 

1号门开始接待客户

2号门开始接待客户

3号门开始接待客户

4号门开始接待客户

5号门开始接待客户

6号门开始接待客户

没有产生客户

没有产生客户

没有产生客户

新增客户2 1

新增客户2 1

新增客户1 4

没有产生客户

新增客户1 5

新增客户2 1

新增客户1 8

没有产生客户

没有产生客户

没有产生客户

新增客户1 5

没有产生客户

没有产生客户

没有产生客户

没有产生客户

没有产生客户

没有产生客户

新增客户1 5

新增客户0 4

新增客户1 6

新增客户0 4

没有产生客户

没有产生客户

没有产生客户

没有产生客户

新增客户2 1

新增客户1 5

新增客户2 1

新增客户2 1

新增客户1 1

没有产生客户

没有产生客户

没有产生客户

没有产生客户

新增客户1 7

没有产生客户

新增客户1 2

新增客户1 2

新增客户2 1

 

但是用6个线程分别生成用户的速度太快了,我觉得把生成速度改慢点方便观察。继续下一步的完善。

几个小时后。。。。

呵呵不小心一下子把代码写完了,又写又改的用了3个多小时呢,一起贴上来吧,注解写的很详细我就不额外解释了。

 

 

 

import java.util.ArrayList;

public class Bank {

    static ArrayList normalclient = new ArrayList();//存放普通客户

    static ArrayList quickclient = new ArrayList();//存放快速用户

    static ArrayList vipclient = new ArrayList();//存放vip用户

   

    static int allnormalclient ;

    static int allquickclient ;

    static int allvipclient ;

   

   

    static int endnormalclient ;

    static int endquickclient ;

    static int endvipclient ;

   

    public static void main(String[] args) {

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

           new gate().start();

           System.out.println(i+"号门开始接待客户");

           }

       new normalwindow().start();

       new normalwindow().start();

       new normalwindow().start();

       new normalwindow().start();

      

       new quickwindow().start();

       new vipwindow().start();

       new allrecords().start();

    }

 

}

 

class client{//封装用户对象,带有用户类型和办理业务所需时间(随机生成)

    int type = 0;//0vip用户,1为普通用户,2为快速用户

    int time = 0;

     client(){

       int i = (int) (Math.random()*10);

       if(i==0){type = 0;}

       if(i>0&i<7){type = 1;}

       if(i>6){type = 2;}

       if(type == 2){

           this.time = 100;

       }else this.time = (((int)(Math.random()*10))+1)*100;/*最小时间是100,最大为1000,因为计划有6个门以500毫秒有50%的概率产生客户

                                                     所以对应6个窗口最大处理时间为1000,则会出现的状况是有时客户较少,各种客户

                                                     到对应窗口办理业务,而有时客户较多,个窗口开始协调办理业务。但总的客户数量

                                                     是银行可以负担的。*/

     }

    public int gettype() {

       return type;

    }

    public int gettime() {

       return time;

    }

}

 

class gate extends Thread { //我计划分6个线程分别产生用户对象,用户从门进来么所以用gate做类名。

    public void run() {

       while(true){

           try {

              sleep(500);

           } catch (InterruptedException e) {

              e.printStackTrace();

           }

           if(((int)(Math.random()*2))==1){

              client c = new client();

              int type = c.gettype();

              int time = c.gettime();

              if(type == 1){Bank.normalclient.add(c);Bank.allnormalclient++; }

              if(type == 2){Bank.quickclient.add(c);Bank.allquickclient++;}

              if(type == 0){Bank.vipclient.add(c);Bank.allvipclient++;}

              /*System.out.println("新增客户"+type+" "+time);

              }else{

                  System.out.println("没有产生客户");*/

              }

             

                  //System.out.println(Bank.normalclient.size());

             

           }/*最小时间是100,最大为1000,因为计划有6个门以500毫秒有50%的概率产生客户

       所以对应6个窗口最大处理时间为1000,则会出现的状况是有时客户较少,各种客户

       到对应窗口办理业务,而有时客户较多,个窗口开始协调办理业务。但总的客户数量

       是银行可以负担的。*/

       }

    }

 

 

class normalwindow extends Thread {

    public void run(){

       try {

           sleep(5000);//先让他睡5秒能客户上来,不然会报错地。

       } catch (InterruptedException e1) {

           e1.printStackTrace();

       }

       while(true){

           if(Bank.normalclient.isEmpty()){/*暂无客户*/}else{

              int time = 0;

              synchronized(Bank.normalclient){

                  client c = (client)Bank.normalclient.get(0);

                  time = c.gettime();

                  Bank.normalclient.remove(0);

                  }

                  try {

                     sleep(time);//这是表示正在处理业务,同时也释放了锁定下一个线程可以拿到任务了。

                  } catch (InterruptedException e) {

                     e.printStackTrace();

                  }

                  System.out.println("窗口"+Thread.currentThread().getName()+"处理完普通用户"+"用时"+time);

                  Bank.endnormalclient++;

              }

           }

    }

}

class quickwindow extends Thread {

    public void run (){

       while(true){

           if(Bank.quickclient.isEmpty()){

              if(Bank.normalclient.size()>4){

                  int time = 0;

                  synchronized(Bank.normalclient){

                     client c = (client)Bank.normalclient.get(4);

                     time = c.gettime();

                     Bank.normalclient.remove(4);

                     }

                     try {

                         sleep(time);//这是表示正在处理业务,同时也释放了锁定下一个线程可以拿到任务了。

                     } catch (InterruptedException e) {

                         e.printStackTrace();

                     }

                     System.out.println("窗口"+Thread.currentThread().getName()+"处理完普通用户"+"用时"+time);

                     Bank.endnormalclient++;//已完成普通客户+1

              }

           }else{

              Bank.quickclient.remove(0);

              try {

                  sleep(100);//快速客户用时间最短

              } catch (InterruptedException e) {

                  e.printStackTrace();

              }

              System.out.println("窗口"+Thread.currentThread().getName()+"处理完成快速客户"+"用时"+100);

              Bank.endquickclient++;//已完成快速客户+1

           }

       }

    }

}

class vipwindow extends Thread {

    public void run (){

       while(true){

           if(Bank.vipclient.isEmpty()){

              if(Bank.normalclient.size()>5){//长度大于5代表前五个窗口已满则6好窗口无vip用户是协助完成;

                  int time = 0;

                  synchronized(Bank.normalclient){

                     client c = (client)Bank.normalclient.get(5);

                     time = c.gettime();

                     Bank.normalclient.remove(5);

                     }

                     try {

                         sleep(time);//这是表示正在处理业务,同时也释放了锁定下一个线程可以拿到任务了。

                     } catch (InterruptedException e) {

                         e.printStackTrace();

                     }

                      System.out.println("窗口"+Thread.currentThread().getName()+"处理完普通用户"+"用时"+time);

                     Bank.endnormalclient++;//已完成普通客户+1

              }

           }else{

              int time =0;

              client c = (client)Bank.vipclient.get(0);

              time = c.gettime();

              Bank.vipclient.remove(0);

              try {

                  sleep(time);

              } catch (InterruptedException e) {

                  e.printStackTrace();

              }

              System.out.println("窗口"+Thread.currentThread().getName()+"处理完成vip客户"+"用时"+time);

              Bank.endvipclient++;

           }

       }

    }

}

 

class allrecords extends Thread{//最后完善一下,每隔20秒统计一次所有数据

    public void run(){

       while(true){

           try {

              sleep(20000);

           } catch (InterruptedException e) {

              e.printStackTrace();

           }

           int all = Bank.allnormalclient+Bank.allquickclient+Bank.allvipclient;

           int end = Bank.endnormalclient+Bank.endquickclient+Bank.endvipclient;

           System.out.println("累计所有客户"+all+""+"已经处理"+end+"");

           System.out.println("其中普通客户"+Bank.allnormalclient+""+"已处理"+Bank.endnormalclient+"");

           System.out.println("其中快速客户"+Bank.allquickclient+""+"已处理"+Bank.endquickclient+"");

           System.out.println("其中vip客户"+Bank.allvipclient+""+"已处理"+Bank.endvipclient+"");

       }

    }

}

 

 

 

 

OK了然后发下运行结果,是前20秒的,就不多发了。05号线程是6个独立产生客户的线程,6号到11号线程分别是6个服务窗口线程,10号为快速客户窗口,11号为vip客户窗口。

 

1号门开始接待客户

2号门开始接待客户

3号门开始接待客户

4号门开始接待客户

5号门开始接待客户

6号门开始接待客户

窗口Thread-10处理完成快速客户用时100

窗口Thread-11处理完成vip客户用时500

窗口Thread-10处理完成快速客户用时100

窗口Thread-10处理完成快速客户用时100

窗口Thread-11处理完成vip客户用时700

窗口Thread-10处理完成快速客户用时100

窗口Thread-10处理完普通用户用时100

窗口Thread-11处理完成vip客户用时900

窗口Thread-10处理完普通用户用时400

窗口Thread-11处理完成vip客户用时900

窗口Thread-11处理完成vip客户用时600

窗口Thread-10处理完普通用户用时1000

窗口Thread-10处理完成快速客户用时100

窗口Thread-10处理完成快速客户用时100

窗口Thread-9处理完普通用户用时100

窗口Thread-7处理完普通用户用时200

窗口Thread-11处理完成vip客户用时1000

窗口Thread-10处理完普通用户用时700

窗口Thread-9处理完普通用户用时300

窗口Thread-6处理完普通用户用时500

窗口Thread-10处理完成快速客户用时100

窗口Thread-8处理完普通用户用时700

窗口Thread-7处理完普通用户用时500

窗口Thread-11处理完成vip客户用时800

窗口Thread-7处理完普通用户用时400

窗口Thread-9处理完普通用户用时700

窗口Thread-10处理完成快速客户用时100

窗口Thread-6处理完普通用户用时700

窗口Thread-8处理完普通用户用时800

窗口Thread-10处理完成快速客户用时100

窗口Thread-7处理完普通用户用时600

窗口Thread-6处理完普通用户用时600

窗口Thread-11处理完成vip客户用时700

窗口Thread-9处理完普通用户用时900

窗口Thread-8处理完普通用户用时700

窗口Thread-6处理完普通用户用时300

窗口Thread-11处理完成vip客户用时300

窗口Thread-7处理完普通用户用时600

窗口Thread-6处理完普通用户用时200

窗口Thread-8处理完普通用户用时200

窗口Thread-9处理完普通用户用时500

窗口Thread-8处理完普通用户用时400

窗口Thread-9处理完普通用户用时100

窗口Thread-10处理完成快速客户用时100

窗口Thread-6处理完普通用户用时400

窗口Thread-8处理完普通用户用时900

窗口Thread-9处理完普通用户用时800

窗口Thread-6处理完普通用户用时800

窗口Thread-11处理完成vip客户用时400

窗口Thread-7处理完普通用户用时1000

窗口Thread-7处理完普通用户用时200

窗口Thread-9处理完普通用户用时500

窗口Thread-8处理完普通用户用时1000

窗口Thread-6处理完普通用户用时900

窗口Thread-9处理完普通用户用时500

窗口Thread-8处理完普通用户用时600

窗口Thread-10处理完成快速客户用时100

窗口Thread-10处理完成快速客户用时100

窗口Thread-9处理完普通用户用时600

窗口Thread-10处理完成快速客户用时100

窗口Thread-6处理完普通用户用时1000

窗口Thread-10处理完成快速客户用时100

窗口Thread-8处理完普通用户用时200

窗口Thread-11处理完成vip客户用时1000

窗口Thread-11处理完成vip客户用时200

窗口Thread-8处理完普通用户用时500

窗口Thread-7处理完普通用户用时600

窗口Thread-10处理完成快速客户用时100

窗口Thread-6处理完普通用户用时200

窗口Thread-9处理完普通用户用时700

窗口Thread-11处理完成vip客户用时200

窗口Thread-7处理完普通用户用时300

窗口Thread-10处理完成快速客户用时100

窗口Thread-9处理完普通用户用时700

窗口Thread-8处理完普通用户用时300

窗口Thread-6处理完普通用户用时1000

窗口Thread-7处理完普通用户用时700

窗口Thread-10处理完成快速客户用时100

窗口Thread-6处理完普通用户用时400

窗口Thread-10处理完成快速客户用时100

窗口Thread-8处理完普通用户用时200

窗口Thread-9处理完普通用户用时1000

窗口Thread-10处理完成快速客户用时100

窗口Thread-7处理完普通用户用时300

窗口Thread-11处理完成vip客户用时300

窗口Thread-6处理完普通用户用时900

窗口Thread-8处理完普通用户用时400

窗口Thread-10处理完成快速客户用时100

窗口Thread-10处理完成快速客户用时100

窗口Thread-9处理完普通用户用时900

窗口Thread-8处理完普通用户用时500

窗口Thread-10处理完成快速客户用时100

窗口Thread-8处理完普通用户用时200

窗口Thread-7处理完普通用户用时400

窗口Thread-6处理完普通用户用时900

窗口Thread-11处理完成vip客户用时500

窗口Thread-6处理完普通用户用时100

窗口Thread-8处理完普通用户用时100

窗口Thread-8处理完普通用户用时100

窗口Thread-11处理完成vip客户用时700

窗口Thread-9处理完普通用户用时500

窗口Thread-9处理完普通用户用时400

窗口Thread-7处理完普通用户用时1000

窗口Thread-10处理完成快速客户用时100

窗口Thread-7处理完普通用户用时100

窗口Thread-6处理完普通用户用时900

窗口Thread-8处理完普通用户用时900

窗口Thread-10处理完成快速客户用时100

窗口Thread-9处理完普通用户用时700

累计所有客户112人已经处理109

其中普通客户72人已处理69

其中快速客户24人已处理24

其中vip客户16人已处理16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值