张孝祥老师银行系统案例
2014-05-23 14:57
330 查看
package yinghangxitong;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MainClass {
/**
* @author chenzhiyuan
*/
// 用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。
//接着在创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码
public static void main(String[] args) {
for(int i=1;i<5;i++){
//新建四个普通窗口,模拟普通窗口
ServiceWindow commonwindow=new ServiceWindow();
//设定指定窗口的ID
commonwindow.setWindowid(i);
commonwindow.start();
}
//新建一个vip窗口
ServiceWindow vipwindow=new ServiceWindow();
vipwindow.setType(CustomerType.VIP);
vipwindow.start();
//快速窗口
ServiceWindow expresswindow=new ServiceWindow();
expresswindow.setType(CustomerType.EXPRESS);
expresswindow.start();
//开启三个线程,模拟三个窗口
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
//产生模拟的新客户
Integer number=NumberMachine.getInstance().getExpressManager().generateNewManager();
System.out.println("第"+number+"号快速客户在等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_Time*2, //执行间隔
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Integer number=NumberMachine.getInstance().getVipManager().generateNewManager();
System.out.println("第"+number+"号VIP客户在等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_Time*6,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Integer number=NumberMachine.getInstance().getCommonManager().generateNewManager();
System.out.println("第"+number+"号普通客户在等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_Time,
TimeUnit.SECONDS);
}
}
package yinghangxitong;
import java.util.ArrayList;
import java.util.List;
/**
* @author chenzhiyuan
*/
//定义用户存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合
//定义个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。
//号码机器对象,负责产生客户
public class NumberManager {
private int lastNumber=0;
//排队序列
private List<Integer> queueNumber=new ArrayList<Integer>();
//每次产生一个人加入到list中,现在是第lastNumber为客户开始服务
public synchronized int generateNewManager(){
queueNumber.add(++lastNumber);
return lastNumber;
}
//取号码
public synchronized Integer fetchServiceNumber(){
if(queueNumber.size()>0){
return (Integer)queueNumber.remove(0);
}else{
return null;
}
}
}
package yinghangxitong;
/**
* @author chenzhiyuan
*/
//定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法
//来返回这三个NumberManager对象将NumberMachine类设计成单例。
public class NumberMachine {
private NumberManager commonManager = new NumberManager();
private NumberManager expressManager = new NumberManager();
private NumberManager vipManager = new NumberManager();
public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getVipManager() {
return vipManager;
}
// 单例模式,构造方法私有化
private NumberMachine() {
}
public static NumberMachine getInstance() {
return instance;
}
private static NumberMachine instance = new NumberMachine();
}
package yinghangxitong;
/**
* @author chenzhiyuan
*/
//系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
//重写toString方法,返回类型的中文名称。这是在后面编写代码时重构出来的,刚开始不用考虑
//CustomerType枚举类
//枚举类型,覆写toStirng()方法
public enum CustomerType {
COMMON, EXPRESS, VIP;
@Override
public String toString() {
// TODO Auto-generated method stub
switch (this) {
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return name();
}
return null;
}
}
package yinghangxitong;
import java.util.Random;
import java.util.concurrent.Executors;
/**
* @author chenzhiyuan
*/
// 定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法
// 定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息
//ServiceWindow类
//窗口依次叫号
public class ServiceWindow {
private int windowNum=1;
public void setWindowid(int windowid) {
this.windowNum = windowid;
}
public void setType(CustomerType type) {
this.type = type;
}
//根据类型的不同进行叫号
private CustomerType type=CustomerType.COMMON;
public void start(){
//
Executors.newSingleThreadExecutor().execute(new Runnable() {
public void run() {
while(true){
switch (type) {
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
}
}});}
//普通窗口
private void commonService() {
String windowName="第"+windowNum+"号"+type+"窗口";
System.out.println(windowName+"正在获取普通任务");
//取票
Integer serviceNum=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
if(serviceNum!=null){
System.out.println(windowName+"开始为第"+serviceNum+"号普通客户服务");
int maxRand=Constants.MAX_SERVICE_TIME - Constants.Min_SERVICE_TIME;//最大的服务时间
int serveTime=new Random().nextInt(maxRand)+1+Constants.Min_SERVICE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNum+"号普通客户服务,总共耗时"
+serveTime/1000+"秒");
}
else{
System.out.println(windowName+"没有取得普通任务,正在空闲一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//快速窗口
private void expressService() {
//产生客户的实例,
Integer serviceNum=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
String windowName="第"+windowNum+"号"+type+"窗口";
System.out.println(windowName+"开始获取快速任务");
if(serviceNum!=null){
System.out.println(windowName+"开始为第"+serviceNum+"号快速客户服务");
int serviceTime=Constants.Min_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNum+"号快速客户服务,总共耗时"+
serviceTime/1000+"秒");
}
else{
System.out.println(windowName+"没有取到快速任务");
//没有任务时,为普通客户服务
commonService();
}
}
private void vipService() {
String windowName="第"+windowNum+"号"+type+"窗口";
System.out.println(windowName+"正在开始获取VIP任务");
Integer serviceNum=NumberMachine.getInstance().getVipManager().fetchServiceNumber();
if(serviceNum!=null){
System.out.println(windowName+"开始为第"+serviceNum+"号VIP客户服务");
int maxRand=Constants.MAX_SERVICE_TIME-Constants.Min_SERVICE_TIME;//最大的服务时间
int serveTime=new Random().nextInt(maxRand)+1+Constants.Min_SERVICE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNum+"号VIP客户服务,总共耗时"+
serveTime/1000+"秒");
}
else{
System.out.println(windowName+"没有取到VIP任务!");//传递此时的type,
//所以执行commonService()时还是VIP格式类型还是--->第1号VIP窗口开始为第5号普通客户服务
commonService();
}
}
}
package yinghangxitong;
public class Constants {
/**
* @author chenzhiyuan
*/
// 定义三个常量:MAX_SERVICE_TIME, MIN_SERVICE_TIME, COMMON_CUSTOMER_INTEGVAL_TIME,
// 经常用到的常量
public static int MAX_SERVICE_TIME = 10000;
public static int Min_SERVICE_TIME = 1000;
public static int COMMON_CUSTOMER_Time = 1;
}
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MainClass {
/**
* @author chenzhiyuan
*/
// 用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。
//接着在创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码
public static void main(String[] args) {
for(int i=1;i<5;i++){
//新建四个普通窗口,模拟普通窗口
ServiceWindow commonwindow=new ServiceWindow();
//设定指定窗口的ID
commonwindow.setWindowid(i);
commonwindow.start();
}
//新建一个vip窗口
ServiceWindow vipwindow=new ServiceWindow();
vipwindow.setType(CustomerType.VIP);
vipwindow.start();
//快速窗口
ServiceWindow expresswindow=new ServiceWindow();
expresswindow.setType(CustomerType.EXPRESS);
expresswindow.start();
//开启三个线程,模拟三个窗口
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
//产生模拟的新客户
Integer number=NumberMachine.getInstance().getExpressManager().generateNewManager();
System.out.println("第"+number+"号快速客户在等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_Time*2, //执行间隔
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Integer number=NumberMachine.getInstance().getVipManager().generateNewManager();
System.out.println("第"+number+"号VIP客户在等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_Time*6,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Integer number=NumberMachine.getInstance().getCommonManager().generateNewManager();
System.out.println("第"+number+"号普通客户在等待服务");
}
},
0,
Constants.COMMON_CUSTOMER_Time,
TimeUnit.SECONDS);
}
}
package yinghangxitong;
import java.util.ArrayList;
import java.util.List;
/**
* @author chenzhiyuan
*/
//定义用户存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合
//定义个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。
//号码机器对象,负责产生客户
public class NumberManager {
private int lastNumber=0;
//排队序列
private List<Integer> queueNumber=new ArrayList<Integer>();
//每次产生一个人加入到list中,现在是第lastNumber为客户开始服务
public synchronized int generateNewManager(){
queueNumber.add(++lastNumber);
return lastNumber;
}
//取号码
public synchronized Integer fetchServiceNumber(){
if(queueNumber.size()>0){
return (Integer)queueNumber.remove(0);
}else{
return null;
}
}
}
package yinghangxitong;
/**
* @author chenzhiyuan
*/
//定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法
//来返回这三个NumberManager对象将NumberMachine类设计成单例。
public class NumberMachine {
private NumberManager commonManager = new NumberManager();
private NumberManager expressManager = new NumberManager();
private NumberManager vipManager = new NumberManager();
public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getVipManager() {
return vipManager;
}
// 单例模式,构造方法私有化
private NumberMachine() {
}
public static NumberMachine getInstance() {
return instance;
}
private static NumberMachine instance = new NumberMachine();
}
package yinghangxitong;
/**
* @author chenzhiyuan
*/
//系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
//重写toString方法,返回类型的中文名称。这是在后面编写代码时重构出来的,刚开始不用考虑
//CustomerType枚举类
//枚举类型,覆写toStirng()方法
public enum CustomerType {
COMMON, EXPRESS, VIP;
@Override
public String toString() {
// TODO Auto-generated method stub
switch (this) {
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return name();
}
return null;
}
}
package yinghangxitong;
import java.util.Random;
import java.util.concurrent.Executors;
/**
* @author chenzhiyuan
*/
// 定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法
// 定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息
//ServiceWindow类
//窗口依次叫号
public class ServiceWindow {
private int windowNum=1;
public void setWindowid(int windowid) {
this.windowNum = windowid;
}
public void setType(CustomerType type) {
this.type = type;
}
//根据类型的不同进行叫号
private CustomerType type=CustomerType.COMMON;
public void start(){
//
Executors.newSingleThreadExecutor().execute(new Runnable() {
public void run() {
while(true){
switch (type) {
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
}
}});}
//普通窗口
private void commonService() {
String windowName="第"+windowNum+"号"+type+"窗口";
System.out.println(windowName+"正在获取普通任务");
//取票
Integer serviceNum=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
if(serviceNum!=null){
System.out.println(windowName+"开始为第"+serviceNum+"号普通客户服务");
int maxRand=Constants.MAX_SERVICE_TIME - Constants.Min_SERVICE_TIME;//最大的服务时间
int serveTime=new Random().nextInt(maxRand)+1+Constants.Min_SERVICE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNum+"号普通客户服务,总共耗时"
+serveTime/1000+"秒");
}
else{
System.out.println(windowName+"没有取得普通任务,正在空闲一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//快速窗口
private void expressService() {
//产生客户的实例,
Integer serviceNum=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
String windowName="第"+windowNum+"号"+type+"窗口";
System.out.println(windowName+"开始获取快速任务");
if(serviceNum!=null){
System.out.println(windowName+"开始为第"+serviceNum+"号快速客户服务");
int serviceTime=Constants.Min_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNum+"号快速客户服务,总共耗时"+
serviceTime/1000+"秒");
}
else{
System.out.println(windowName+"没有取到快速任务");
//没有任务时,为普通客户服务
commonService();
}
}
private void vipService() {
String windowName="第"+windowNum+"号"+type+"窗口";
System.out.println(windowName+"正在开始获取VIP任务");
Integer serviceNum=NumberMachine.getInstance().getVipManager().fetchServiceNumber();
if(serviceNum!=null){
System.out.println(windowName+"开始为第"+serviceNum+"号VIP客户服务");
int maxRand=Constants.MAX_SERVICE_TIME-Constants.Min_SERVICE_TIME;//最大的服务时间
int serveTime=new Random().nextInt(maxRand)+1+Constants.Min_SERVICE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNum+"号VIP客户服务,总共耗时"+
serveTime/1000+"秒");
}
else{
System.out.println(windowName+"没有取到VIP任务!");//传递此时的type,
//所以执行commonService()时还是VIP格式类型还是--->第1号VIP窗口开始为第5号普通客户服务
commonService();
}
}
}
package yinghangxitong;
public class Constants {
/**
* @author chenzhiyuan
*/
// 定义三个常量:MAX_SERVICE_TIME, MIN_SERVICE_TIME, COMMON_CUSTOMER_INTEGVAL_TIME,
// 经常用到的常量
public static int MAX_SERVICE_TIME = 10000;
public static int Min_SERVICE_TIME = 1000;
public static int COMMON_CUSTOMER_Time = 1;
}
相关文章推荐
- 黑马程序员-银行挂号系统(张孝祥老师)
- 银行储蓄业务系统数据备份解决方案案例
- 看张孝祥老师银行调度系统总结
- 黑马程序员-交通灯管理系统(张孝祥老师)
- 银行业务调度系统(张孝祥老师)
- 黑马程序员------张孝祥老师------银行业务调度系统
- 黑马程序员------张孝祥老师------交通灯管理系统
- 黑马程序员-银行调度系统案例
- 交通灯管理系统——向张孝祥老师学习
- 银行业务调度系统——向张孝祥老师学习
- 黑马程序员-一种不同张孝祥老师视频中交通灯管理系统的实现
- 银行系统(参考老师模板)
- java张孝祥(7) 银行管理系统
- 黑马程序员_张孝祥7k面试题_银行调度系统
- java小案例--银行调度系统
- 张孝祥老师交通灯管理系统的学习笔记 在做一件事时,首先要明确要达到什么效果。有目的性。就软件项目来说就是,首先要看的就是项目所提出的项目要求。做项目,不急于写代码,先把问题搞清楚,把要求分
- 张孝祥老师银行业务调度系统统视频学习
- 【黑马程序员】 学习笔记 - 直击7K面试题 - 张孝祥老师的交通等管理系统
- 交通灯管理系统分析(张孝祥老师)
- 张孝祥老师交通灯管理系统视频学习