银行柜台业务调度系统

package com.tianRanDai.interview.bankOperation;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;


public class Test {
	public static void main(String[] args) {
		//普通客户队列集合
	    BlockingQueue<Customer> ordinaryCustomers  = new ArrayBlockingQueue<Customer>(100,false);
		//快速客户队列集合
		BlockingQueue<Customer> quickCustomers = new ArrayBlockingQueue<Customer>(20,false) ;
		//VIP客户队列集合
	    BlockingQueue<Customer> VIPCustomers =new ArrayBlockingQueue<Customer>(20,false);
		//初始化银行服务台
		BankReception bankReception = new BankReception(8,2,2);
		CustomerScheduer customerScheduer = CustomerScheduer.newInstance(ordinaryCustomers,quickCustomers,VIPCustomers);
		customerScheduer.init();
		BankReceptionController.newInstance(bankReception, customerScheduer).init();
		
	}
}

package com.tianRanDai.interview.bankOperation;

/**
 * 客户等级
 * @author hadoop
 *
 */
public enum CustomerLevel {
	Ordinary,Quick,VIP;
}

package com.tianRanDai.interview.bankOperation;

/**
 * 客户
 * @author hadoop
 *
 */
public class Customer {
	private int  num ;
	private CustomerLevel level;
	public Customer(){};
	public Customer(int num, CustomerLevel level){
		this.num = num;
		this.level = level;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public CustomerLevel getLevel() {
		return level;
	}
	public void setLevel(CustomerLevel level) {
		this.level = level;
	}
	
	
}

package com.tianRanDai.interview.bankOperation;

import java.util.Random;
import java.util.concurrent.BlockingQueue;

/**
 * 用于产生客户
 * @author hadoop
 *
 */
public class GenCustormer {
	/**
	 * 
	 * @param customers
	 * @param level
	 * @param times
	 */
	public static synchronized void genCustormer(BlockingQueue<Customer> customers, CustomerLevel level, int times) {
		
		try {
			Thread.sleep((new Random().nextInt(times)+1)*1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		if(customers.isEmpty()){
			Customer customer  = new Customer(1,level);
			try {
				//将一名客户加入对应等级的客户队列
				customers.put(customer);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("第"+customer.getNum()+"位"+level.name()+"客户正在等待!");
		}else{
			Customer customer = new Customer(customers.size(),level);
			try {
				//将一名客户加入对应等级的客户队列
				customers.put(customer);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("第"+(customer.getNum()+1)+"位"+level.name()+"客户正在等待!");
		}
		
	}

}

package com.tianRanDai.interview.bankOperation;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 客户调度器,用于产生客户并给个客户分组
 */
public class CustomerScheduer {
	
	//普通客户队列集合
	private  BlockingQueue<Customer> ordinaryCustomers ;
	//快速客户队列集合
	private  BlockingQueue<Customer> quickCustomers ;
	//VIP客户队列集合
	private  BlockingQueue<Customer> VIPCustomers ;
	
	
	private static CustomerScheduer instance;
	private CustomerScheduer(){};
	private CustomerScheduer(BlockingQueue<Customer> ordinaryCustomers,BlockingQueue<Customer> quickCustomers ,BlockingQueue<Customer> VIPCustomers){
		this.ordinaryCustomers = ordinaryCustomers;
		this.quickCustomers = quickCustomers;
		this.VIPCustomers = VIPCustomers;
	};
	/**
	 * 单例出客户调度器
	 * @param ordinaryCustomers
	 * @param quickCustomers
	 * @param VIPCustomers
	 * @return
	 */
	public static CustomerScheduer newInstance(
			BlockingQueue<Customer> ordinaryCustomers,BlockingQueue<Customer> quickCustomers ,BlockingQueue<Customer> VIPCustomers){
		if(instance!=null){
			return instance;
		}
		return new CustomerScheduer(ordinaryCustomers,quickCustomers,VIPCustomers);
	}
	
	/**
	 * 启动4个线程来产生客户,并对客户分组
	 */
	public void init(){
		int doorsNum = 4;
		ExecutorService genCustomerPool =  Executors.newFixedThreadPool(doorsNum);
		for(int i = 0 ;i<doorsNum;i++){
			genCustomerPool.execute(new Runnable(){
				@Override
				public void run() {
					for(int i=0;i<1000;i++){
						GenCustormer.genCustormer(ordinaryCustomers, CustomerLevel.Ordinary,1);//要求1~2秒
						GenCustormer.genCustormer(quickCustomers, CustomerLevel.Quick,7);//要求1~8秒
						GenCustormer.genCustormer(VIPCustomers, CustomerLevel.VIP,7);//要求1~8秒
					}
				}
				
			});
		}
	}
	
	public BlockingQueue<Customer> getOrdinaryCustomers() {
		return ordinaryCustomers;
	}
	public void setOrdinaryCustomers(BlockingQueue<Customer> ordinaryCustomers) {
		this.ordinaryCustomers = ordinaryCustomers;
	}
	public BlockingQueue<Customer> getQuickCustomers() {
		return quickCustomers;
	}
	public void setQuickCustomers(BlockingQueue<Customer> quickCustomers) {
		this.quickCustomers = quickCustomers;
	}
	public BlockingQueue<Customer> getVIPCustomers() {
		return VIPCustomers;
	}
	public void setVIPCustomers(BlockingQueue<Customer> customers) {
		VIPCustomers = customers;
	}

	
}

package com.tianRanDai.interview.bankOperation;

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * 银行业务控制器
 * @author hadoop
 *
 */
public class BankReceptionController {
	Semaphore semaphore = new Semaphore(6);
	//银行服务台
	private BankReception bankReception;
	//客户调度器
	private CustomerScheduer customerScheduer;
	
	private BankReceptionController(){};
	private static BankReceptionController instance;
	
	//下面属性均为附加属性
	
	//普通窗口的个数
	private int ordinaryWindowsNum ;
	//快速窗口的个数
	private int quickWindowsNum ;
	//VIP窗口的个数
	private int VIPWindowsNum ;
	
	
	//单例出银行业务调度器
	public static BankReceptionController newInstance(BankReception bankReception, CustomerScheduer customerScheduer){
		if(instance!=null){
			return instance;
		}
		return new BankReceptionController(bankReception,customerScheduer);	
		
	}
	private  BankReceptionController(BankReception bankReception ,CustomerScheduer customerScheduer){
		this.bankReception = bankReception;
		this.customerScheduer = customerScheduer;
		//下面属性均为附加属性初始化
		this.ordinaryWindowsNum = bankReception.getOrdinaryWindowsNum();
		this.quickWindowsNum = bankReception.getQuickWindowsNum();
		this.VIPWindowsNum = bankReception.getVIPWindowsNum();
	}
	
	/**
	 * 银行开始服务
	 */
	public void init(){
		//普通服务窗口线程池
		ExecutorService odinaryWindows =  Executors.newFixedThreadPool(bankReception.getOrdinaryWindowsNum());
		//快速服务窗口线程池
		ExecutorService quickWindows =  Executors.newFixedThreadPool(bankReception.getQuickWindowsNum());
		//VIP服务窗口线程池
		ExecutorService VIPWindows =  Executors.newFixedThreadPool(bankReception.getVIPWindowsNum());
		//启动多个普通窗口服务线程,并对普通客户服务
		for(int i=1;i<=ordinaryWindowsNum;i++){
			
			final int seq = i;
			odinaryWindows.execute(new Runnable(){
				//处理普通业务
				@Override
				public void run() {
					while(true){
						int time1 = (new Random().nextInt(25)+20)*1000;
						int time2 = 0;
						int time3 =  20;
						//产生服务结果
						Customer record = 
							BankReceptionController.this.ordinaryService(time1,time2,time3);
						if(record!=null){
							System.out.println("第"+seq+"号普通窗口服务了:"+"第"+record.getNum()+"号"+record.getLevel()+"客户");
						}
					}
					
					
				}

				
				
			});
		}
		//启动多个快速窗口服务线程,并对快速客户和普通客户服务
		for(int i=1;i<=quickWindowsNum;i++){
			
			final int seq = i;
			quickWindows.execute(new Runnable(){

				@Override
				public void run() {
					while(true){
						int time1 = (new Random().nextInt(2)+4)*1000;
						int time2 = (new Random().nextInt(20)+20)*1000;
						int time3 =  0;
						//产生服务结果
						Customer record = 
							BankReceptionController.this.quickService(time1,time2,time3);
						if(record!=null){
							System.out.println("第"+seq+"号快速窗口服务了:"+"第"+record.getNum()+"号"+record.getLevel()+"客户");
						}
						
					
					}
				}
				
			});
		}
		//启动多个VIP窗口服务线程,并对VIP客户和普通客户服务
		for(int i=1;i<=VIPWindowsNum;i++){
			final int seq = i;
			VIPWindows.execute(new Runnable(){
					@Override
					public void run() {
						while(true){
							int time1 = (new Random().nextInt(5)+10)*1000;//执行普通业务耗时 5~10 秒 
							int time2 = (new Random().nextInt(20)+20)*1000;//执行最高级任务耗时 5~10 秒 
							int time3 =  0;
							//产生服务结果
							Customer record = 
								BankReceptionController.this.VIPService(time1,time2,time3);
							if(record!=null){
								System.out.println("第"+seq+"号VIP窗口服务了:"+"第"+record.getNum()+"号"+record.getLevel()+"客户");
							}
						}
						
					}
				
			});
		}
	}
	/**
	 * 电费水费窗口
	 * @param time1
	 * @param time2
	 * @param time3
	 * @param time4
	 * @return
	 */
	protected Customer quickService(int time1, int time2, int time3) {
		while(customerScheduer.getQuickCustomers().isEmpty()){
			if(!customerScheduer.getOrdinaryCustomers().isEmpty()&&customerScheduer.getOrdinaryCustomers().size()>ordinaryWindowsNum){
				
				return getRecord(customerScheduer.getOrdinaryCustomers(), time2);
			}
		}
		return getRecord(customerScheduer.getQuickCustomers(),time1);
	}
	
	/**
	 * VIP窗口
	 * @param time1
	 * @param time2
	 * @param time3
	 * @param time4
	 * @return
	 */
	protected   Customer VIPService(int time1, int time2, int time3) {
		while(customerScheduer.getVIPCustomers().isEmpty()){
			if(!customerScheduer.getOrdinaryCustomers().isEmpty()&&customerScheduer.getOrdinaryCustomers().size()>ordinaryWindowsNum){
				return getRecord(customerScheduer.getOrdinaryCustomers(), time2);
			}
		}
		return getRecord(customerScheduer.getVIPCustomers(),time1);
	}
	/**
	 * 普通窗口
	 * @param time1
	 * @param time2
	 * @param time3
	 * @param time4
	 * @return
	 */
	protected   Customer ordinaryService(
			int time1, int time2, int time3) {
		
		while(customerScheduer.getOrdinaryCustomers().isEmpty()){
			try {
				//短等
				Thread.sleep(time3);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		
		return getRecord(customerScheduer.getOrdinaryCustomers(),time1);
	}
	
	
//	protected  Customer service(BlockingQueue<Customer> firstQueue,BlockingQueue<Customer> secondQueue,int time1,int time2,int time3,int time4) {
//		
//			try {
//				semaphore.acquire();
//			} catch (InterruptedException e1) {
//				// TODO Auto-generated catch block
//				e1.printStackTrace();
//			}
//			while(firstQueue.isEmpty()){
//				//优先级最高的队列为空时
//				if(secondQueue!=null){
//					
//					if(secondQueue.isEmpty()){
//						try {
//							//长等
//							Thread.sleep(time4);
//						} catch (InterruptedException e) {
//							e.printStackTrace();
//						}
//					}else{
//						System.out.println(Thread.currentThread().getName()+"开始处理服务2");
//						return getRecord(secondQueue,time2);
//					}
//				}else{
//					try {
//						//短等
//						Thread.sleep(time3);
//					} catch (InterruptedException e) {
//						e.printStackTrace();
//					}
//				}
//			}
//			System.out.println(Thread.currentThread().getName()+"开始处理服务1");
//			return getRecord(firstQueue,time1);
//			
//			//优先级最高的队列不为空时
//	}
		
	/**
	 * 产生服务结果
	 */
	private  Customer getRecord(BlockingQueue<Customer> Queue,int time) {
		Customer record = null;
		try {
			long startTime = System.currentTimeMillis();
				
				Thread.sleep(time);
			
			long endTime = System.currentTimeMillis();
			System.out.println("处理本次业务耗时:"+(endTime-startTime)/1000+"秒");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		try {
			record = Queue.take();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		semaphore.release();
		return record;
	}
	
	public BankReception getBankReception() {
		return bankReception;
	}
	public void setBankReception(BankReception bankReception) {
		this.bankReception = bankReception;
	}
	
	
	public CustomerScheduer getCustomerScheduer() {
		return customerScheduer;
	}
	public void setCustomerScheduer(CustomerScheduer customerScheduer) {
		this.customerScheduer = customerScheduer;
	}
	
	
}

package com.tianRanDai.interview.bankOperation;

/**
 * 银行
 * @author hadoop
 *
 */
public class BankReception {
	//普通窗口的个数
	private int ordinaryWindowsNum ;
	//快速窗口的个数
	private int quickWindowsNum ;
	//VIP窗口的个数
	private int VIPWindowsNum ;
	public  BankReception(){
		
	}
	public  BankReception(int ordinaryWindowsNum,int quickWindowsNum,int VIPWindowsNum){
		this.ordinaryWindowsNum = ordinaryWindowsNum;
		this.quickWindowsNum = quickWindowsNum;
		this.VIPWindowsNum = VIPWindowsNum;
		
	}
	

	public int getOrdinaryWindowsNum() {
		return ordinaryWindowsNum;
	}

	public void setOrdinaryWindowsNum(int ordinaryWindowsNum) {
		this.ordinaryWindowsNum = ordinaryWindowsNum;
	}

	public int getQuickWindowsNum() {
		return quickWindowsNum;
	}

	public void setQuickWindowsNum(int quickWindowsNum) {
		this.quickWindowsNum = quickWindowsNum;
	}

	public int getVIPWindowsNum() {
		return VIPWindowsNum;
	}

	public void setVIPWindowsNum(int windowsNum) {
		VIPWindowsNum = windowsNum;
	}
	
	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值