Java---------银行业务调度问题

原创 2012年03月25日 01:10:07

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

        银行业务的调度问题,咋一看感觉不难,但是真的要下手还真不知道应该从哪个方面开始。我看了好几遍,老师编码的过程,才算是有点明白了。这个主要是用到了线程的部分知识。从需求分析来看,就是说客户来后通过号码机获得自己所需要的类型的服务,比如普通客户的服务,快速客户的服务以及VIP客户的服务。那么对应的窗口就应该同样有这三种类型的服务窗口了。一般来说普通窗口的用户最多,那么对应的这种窗口就必须最多。在需求中,要求每隔一秒就要有一个普通用户等待服务,而快速用户则是在2秒的时候来一位,至于VIP则是6秒来一位。在快速窗口和VIP窗口没有获得相应的任务的时候,应该可以接受来自需要服务的普通用户。
        现在的设计,从上面分析可以看出来,首先有一个号码产生器,这个产生器可以产生3种不同类型的号码。通过这个号码,窗口进行调用。那么我们就要一个类,这个类是号码产生器,并且唯一,可以用单例的模式来实现。而三种号码,应该有相应的 类来生成。统一来定义一个号码管理的类,然后再号码产生器中声明3个这种类的对象就可以了。这个号码生成后,就要通过服务窗口来调用并服务了,我们把这个服务用线程的sleep来实现。窗口的类型我们也必须知道,通过一个枚举类型来声明,在设置这个窗口类型的时候我们可以调用这个类的set方法来设置。同样由于普通窗口有多个,那么我们就要给每一个窗口来设置一个窗口号码,可以方便辨别,去什么类型窗口的几号去要求服务。这两个属性都有相应的set方法。最后就是在MainClass中模拟了,首先我们要把服务窗口new出来,同时把两个属性都通过set方法来设置好。然后就是通过号码管理器来生成不同类型客户的服务号码了。这里我们要使用线程的定时功能来实现这个模拟。对于3种类型的客户有3个线程来实现。
       号码生成器,和号码管理器的代码:

import java.util.ArrayList;
import java.util.List;

public class NumberManager {
	private List<Integer> numberQueue = new ArrayList<Integer>();
	private int lastNumber = 1;
	
	public synchronized Integer  generateNewNumber(){
		//获得服务号码
		numberQueue.add(lastNumber);
		//添加到服务队列中
		return lastNumber ++;
	}
	public synchronized Integer fetchNumber(){
		Integer number = null;
		if(numberQueue.size()>0)
			//如果这个服务队列中有元素就把这个元素返回
			number = numberQueue.remove(0);
		return number;
	} 
}

public class NumberMachine {//对号码管理器进行统一管理
	private NumberManager commonManager = new NumberManager();
	//普通号码管理器
	private NumberManager quickManager= new NumberManager();
	//快速号码管理器
	private NumberManager vipManager= new NumberManager();
	//vip号码管理器
	public NumberManager getCommonManager() {
		return commonManager;
	}
	public NumberManager getQuickManager() {
		return quickManager;
	}
	public NumberManager getVipManager() {
		return vipManager;
	}
	//该号码产生器是只有需要一个实例所以使用单例的模式
	private NumberMachine(){}
	
	public static NumberMachine getInstance(){
		return instance;
	}
	private static NumberMachine instance = new NumberMachine();
}

服务窗口的主要代码:

public class ServiceWindow {
	private CustomerType type = CustomerType.COMMON;
	//窗口类型
	private  int windowId = 1;
	public void start(){
         //用于控制对于不同用户进行服务的线程
		Executors.newSingleThreadExecutor().execute(new Runnable(){
			public void run(){
				while(true){
					switch(type){
						case COMMON:
							 commonSever();
							 break;
						case QUICK:
							 quickSever();
							 break;
						case VIP:
							 vipSever();
							 break;			
		}}}	});	}

    commonSever();quickSever();vipSever();

    这三个方法实现的时候比较相似,主要是获得服务号,并服务,这里就不列出来了。最后就是MainClass了,这个主要是看这个模拟过程是不是可以:

public class MainClass {
	public static void main(String[] args) {
		for(int i=1;i<5;i++){
			//声明4个普通窗口
			ServiceWindow commonWindow = new ServiceWindow();
			commonWindow.setWindowId(i);
			commonWindow.start();
		}
		
		ServiceWindow quickWindow = new ServiceWindow();
		//new快速服务窗口
		quickWindow.setWindowId(5);
		//设置窗口号码
		quickWindow.setType(CustomerType.QUICK);
		//设置窗口类型
		quickWindow.start();
		
		ServiceWindow vipWindow = new ServiceWindow();
		//newVIP服务窗口
		vipWindow.setWindowId(6);
		vipWindow.setType(CustomerType.VIP);
		vipWindow.start();
		
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(//普通客户号码获取
				new Runnable(){
					public void run(){
						synchronized (CustomerType.COMMON) {
							Integer number = NumberMachine.getInstance()
									.getCommonManager().generateNewNumber();
							System.out.println("第" + number + "号普通客户等待服务!!!");
						}
					}
				}, 
				0, 
				Constants.COMMON_CUSTOMER_INTERVAL_TIME, 
				TimeUnit.SECONDS);
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(//快速客户号码获取
				new Runnable(){
					public void run(){
						synchronized (CustomerType.QUICK) {
							Integer number = NumberMachine.getInstance()
									.getQuickManager().generateNewNumber();
							System.out.println("第" + number + "号快速客户等待服务!!!");
						}
					}
				}, 
				0, 
				Constants.COMMON_CUSTOMER_INTERVAL_TIME*2, 
				TimeUnit.SECONDS);
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(//vip客户号码获取
				new Runnable(){
					public void run(){
						synchronized (CustomerType.VIP) {
							Integer number = NumberMachine.getInstance()
									.getVipManager().generateNewNumber();
							System.out.println("第" + number + "号VIP客户等待服务!!!");
						}
					}
				}, 
				0, 
				Constants.COMMON_CUSTOMER_INTERVAL_TIME*6, 
				TimeUnit.SECONDS);
	}
}

     这3个定时器,用于控制不同用户出现的数量,使得数量比是1:6:3.

     今天为止,这个视频终于看完了,至于什么感想吧,觉得自己还有好多没有学明白,还要继续努力呀。


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

黑马程序员_7k银行业务调度问题

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: ●       异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆---- 直行车辆 由西向而来去往南向的车辆----...
  • u010886101
  • u010886101
  • 2014年08月28日 23:00
  • 196

黑马程序员——7k面试题—银行业务调度问题

7k面试题—银行业务调度问题 首先致敬我们敬爱的张老师,为IT教育奉献了一生。最初看张老师的视频时,感觉真的有些不想听,因为视频的音质实在有些杂,而且我还是带着耳塞听的,那感受真的很糟糕。但是我本着学...
  • yjsf216
  • yjsf216
  • 2015年03月17日 01:03
  • 224

【数据结构】银行业务模拟

数据结构实现的一个银行业务模拟 代码参考如下: /* 名称:银行业务模拟 语言:数据结构C语言版 编译环境:VC++ 6.0 日期: 2014-3-26 */ #inclu...
  • u010870518
  • u010870518
  • 2014年03月26日 11:30
  • 2215

银行业务常用基本概念

一 头寸 头寸是一种以买入或卖出表达的交易意向。头寸可指投资者拥有或借用的资金数量。  1、头寸(position)也称为"头衬"就是款项的意思,是金融界及商业界的流行用语。如果银行在当日的全部收...
  • fhx007
  • fhx007
  • 2014年01月02日 22:41
  • 1415

黑马程序员 java_银行业务系统

-------android培训 、java培训、期待与您交流! ---------- 一、需求: 模拟实现银行业务调度系统逻辑,具体需求如下: 1、银行内有6个业务窗口,1 - 4号窗...
  • tklb2006
  • tklb2006
  • 2013年03月27日 06:47
  • 774

多机调度问题(C语言实现)——贪心算法应用(4)

问题描述:                设有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的处理时间为t[i]。                任何作业可以在任何一台机器上面加工处理,...
  • hello_yz
  • hello_yz
  • 2013年04月12日 19:41
  • 2781

流水线调度dp问题

流水线调度 Assembly-Lines-Scheduling 问题:生产产品X需要经过m道手续,现在有两条流水线,每条流水线上m个站点,对应的站点功能相同, p[i][j]表示在第i条流水线上第...
  • BeforeEasy
  • BeforeEasy
  • 2016年08月31日 19:25
  • 769

实验案例3-3银行业务队列简单模拟:

银行业务队列简单模拟
  • u014376961
  • u014376961
  • 2016年07月22日 21:03
  • 1973

PTA 7-3(队列) 银行业务队列简单模拟(25 分) 25分代码

。。 (注: 博客作为交流使用,请勿抄袭应付作业) #include #include #include #include #include #include #include...
  • xiang_6
  • xiang_6
  • 2017年10月11日 16:56
  • 317

最佳调度问题的回溯算法(java实现)

 实验目的:理解回溯法的原理,掌握调度问题的处理方法,实现最佳调度问题的回溯解决。 问题定义输入:1.       任务数N2.       机器数M3.       随机序列长度t[i],其中t[i...
  • icyfire0105
  • icyfire0105
  • 2008年01月29日 21:40
  • 7010
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java---------银行业务调度问题
举报原因:
原因补充:

(最多只允许输入30个字)