银行系统面试题

    技术2022-05-19  21

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

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

     

     

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

     

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

     

    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


    最新回复(0)