黑马程序员_7_模拟银行调度

时间:2023-02-18 11:44:12
--------------------------------android培训java培训期待与您交流! -----------------------------------


模拟银行调度系统

需求:具有六个窗口,四个普通窗口,一个快速窗口,一个vip窗口;

普通窗口:只为普通用户服务。

快速窗口:优先为快速窗口服务,再为普通窗口服务。

VIP窗口,优先为VIP窗口服务,再为普通窗口服务。

服务时间:最大值与最小值,最小值都是快速客户。

客户出现比例。普通:快速:VIP = 6:3:1

 

模拟用户:自身携带了需要完成的业务,与自身的等级

public class client implements Comparable<client>

{

private int clientrank;//客户的等级

private int clientneed;//客户需求

client()

{

set();

}

void set()//初始化客户的需求,与等级

{

this.clientrank=(int)(Math.random()*10+1);

if(this.clientrank<4)

this.clientneed=1;

else this.clientneed=(int)(Math.random()*4+2);

System.out.println("产生一个等级为"+getRankString()+"业务为"+clientneed);

}

public int getClientrank() {

return clientrank;

}

public int getClientneed() {

return clientneed;

}

@Override

public int compareTo(client o) {

return 1;

}

public String toString()

{

return "等级为"+this.getRankString()+"-----需求为"+this.clientneed;

}

public String getRankString()

{

return this.clientrank<4?"<___快速用户___>":this.clientrank<10?"{___普通用户___}":"【___Vip用户___】";

}

}

 

服务窗口:窗口具备向某个银行取出用户的功能,每个窗口都向银行的等候厅取出用户,这里做成线程。

public class Fram implements Runnable

{

private int rank;

private Bank bank;

Fram(int rank)//在构造时,就指明窗口的权限

{

this.rank=rank;

bank=Bank.getBank();//指定为某个银行服务

}

public void run()

{

while(true)

{

if(this.rank==1)//窗口等级化

mommon();

else if(this.rank==2)

quick();

else 

VIP();

}

}

private void mommon()//普通窗口服务

{

client temp=bank.delClient();

if(temp!=null)

{

System.out.println(Thread.currentThread().getName()+"接收到客户--"+temp);

clientEvent(temp.getClientneed());

}else

{

try{Thread.sleep(1000);//没有普通用户则休息一秒

}catch

(Exception e)

{}

}

}

private void quick()//快速窗口服务

{

clientEventPD(bank.quickdelClient());

}

private void  VIP()//vip窗口服务

{

clientEventPD(bank.VIPdelClient());

}

private void clientEventPD(client temp) //特殊客户判断

{

if(temp!=null)

{

System.out.println(Thread.currentThread().getName()+"接收到-----"+temp);

clientEvent(temp.getClientneed());

}

else mommon();

}

private void clientEvent(int time)//处理客户事件

{

try

{

System.out.println(Thread.currentThread().getName()+"处理客户等待"+time+"秒");

Thread.sleep(time*1000);

}

catch(InterruptedException e){}

}

}

 

模拟银行:银行具备存储用户的功能,对相应等级的用户分开存储,并拥有六个窗口

import java.util.LinkedList;

 

public class Bank 

{

private LinkedList<client> wait;

private LinkedList<client> VIPwait;

private LinkedList<client> quickwait;

private static final Bank  bank=new Bank();

private Bank()

{

this.inio();

}

private void inio()

{

this.wait=new LinkedList<>();//存储普通用户

this.VIPwait=new LinkedList<>();//存储快速用户

this.quickwait=new LinkedList<>();//存储VIP用户

}

public static Bank getBank()

{

return bank;

}

//三个窗口取用户

synchronized client delClient()

{

return wait.size()!=0?wait.remove():null;

}

synchronized client quickdelClient()

{

return quickwait.size()!=0?quickwait.remove():delClient();

}

synchronized client VIPdelClient()

{

return VIPwait.size()!=0?VIPwait.remove():delClient();

}

synchronized void addClient(client c)//进入客户

{

if(c.getClientrank()<4)

quickwait.add(c);

else if(c.getClientrank()<10)

wait.add(c);

else VIPwait.add(c);

System.out.println("---------普通用户"+wait.size()+"人"+"---------快速用户"+quickwait.size()+"人"+"----------VIP用户"+VIPwait.size()+"人");

}

void openFram()//打开六个窗口的服务

{

new Thread(new Fram(1),"1号普通窗口").start();

new Thread(new Fram(1)," 2号普通窗口").start();

new Thread(new Fram(1),"  3号普通窗口").start();

new Thread(new Fram(1),"   4号普通窗口").start();

new Thread(new Fram(2),"     快速窗口").start();;

new Thread(new Fram(3),"      VIP窗口").start();

}

}

主程序:模拟随机产生数名用户,间隔(1~10)秒一名用户进入银行,

public class Main {

public static void main(String[] args)

{

final Bank bank=Bank.getBank();

int person =(int)(Math.random()*100+1);//随机产生人数

bank.openFram();

System.out.println("\t\t\t\t\t\t\t将会产生" + person + "客户");

for(int i=1;i<=person;i++)

{

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

try{Thread.sleep(time*1000);}catch(Exception e){}

 

bank.addClient(new client());

}

}

}

黑马程序员_7_模拟银行调度

总结:熟练多线程安全问题与集合的存储功能,便可以有效的完成。

--------------------------------android培训java培训期待与您交流! -----------------------------------