黑马程序员-银行调度系统2
来源:互联网 发布:淘宝拍卖海关真的吗 编辑:程序博客网 时间:2024/05/29 14:29
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
今天下午从16:50开始学习:
1.那么好,开始这次的学习,我们还是来做银行业务调度系统:
然后我们来新建一个窗口类对象ServiceWindow.java
前面我们建好了号码管理器和号码机器两个类。
package com.isoftstone.iterview.bank;
import java.util.concurrent.Executors;
public class ServiceWindow {
//这个窗口首先要不断叫号,需要在线程里面完成
//我们把start方法写上去
public void start(){
//然后我们采用新技术来创建线程
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
//那么在这个run方法里面要写些什么呢,就是窗口叫号
}
});
}
}
2.package com.isoftstone.iterview.bank;
import java.util.concurrent.Executors;
public class ServiceWindow {
//只有三种号码管理器,如何表示只有三种,使用枚举
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
//那么怎么来叫号呢,用循环
while(true){
NumberMachine.getInstance().getCommonManager();//如何知道选择哪一个号码管理器呢,我们要在上面定义一下
}
}
});
}
}
我们新建一个枚举:CustomerType
package com.isoftstone.iterview.bank;
public enum CustomerType {
COMMOM,EXPRESS,VIP;
}
接着在ServiceWindow.java中:
package com.isoftstone.iterview.bank;
import java.util.concurrent.Executors;
public class ServiceWindow {
//只有三种号码管理器,如何表示只有三种,使用枚举
private CustomerType type=CustomerType.COMMOM;//假设默认的是common
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
//那么怎么来叫号呢,用循环
while(true){
NumberMachine.getInstance().getCommonManager();//如何知道选择哪一个号码管理器呢,我们要在上面定义一下
}
}
});
}
}
3.其实有时候用while if,else if,还不如用switch-case,switch里面必须是整形的。
这里有点小麻烦了!
在NumberManager.java中:
package com.isoftstone.iterview.bank;
import java.util.ArrayList;
import java.util.List;
public class NumberManager {
private int lastNumber=1;
private List<Integer> queueNumber=new ArrayList<Integer>();
public synchronized Integer genernateNewManager(){
queueNumber.add(lastNumber);
return lastNumber;
}
public synchronized Integer fetchServiceNumber(){
return queueNumber.remove(0);
}
}
//把int改为Integer
4.import java.util.concurrent.Executors;
public class ServiceWindow {
//只有三种号码管理器,如何表示只有三种,使用枚举
private CustomerType type=CustomerType.COMMON;//假设默认的是common
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
//那么怎么来叫号呢,用循环
while(true){
switch(type){
case COMMON:
]System.out.println("正在获取任务");
Integer number1=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
if(number1!=null){
}else{
System.out.println("没有取到任务");
}
break;
case EXPRESS:
Integer number2=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
break;
case VIP:
Integer number3=NumberMachine.getInstance().getVipManager().fetchServiceNumber();
break;
}
}
}
});
}
}
5.那么是哪个窗口呢,是普通窗口还是vip窗口,是普通窗口又是第几个普通窗口呢?
//只有三种号码管理器,如何表示只有三种,使用枚举
private CustomerType type=CustomerType.COMMON;//假设默认的是common
//我们得来创建一个顺序
private int windowId=1;//默认值是1
//然后获取它们的set方法
public void setType(CustomerType type) {
this.type = type;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
然后:
case COMMON:
String windowName="第"+windowId+"号"+type+"窗口";
第几号什么窗口!
那么这个type的返回值就是它的to string方法
我们在枚举中做:
CustomerType.java中:
package com.isoftstone.iterview.bank;
public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString(){
switch(this){
case COMMON:
return "普通";//return了就不要break
case EXPRESS:
return "快速";
case VIP:
return "vip";
}
return null;
}
}
那么这个type就会返回上面定义的值,这样更专业!
6.if(number1!=null){
long beginTime=System.currentTimeMillis();
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number1+"个"+type+"客户服务花费了"+costTime/1000+"秒");
long beginTime=System.currentTimeMillis();
long serveTime=0;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
那么这个serveTime应该是多少呢,一个最大值与最小值之间:
我们定义一个类:Constants
package com.isoftstone.iterview.bank;
public class Constants {
public static int MAX_SERVE_TIME=10000;//最长时间为10秒
public static int MIN_SERVE_TIME=1000;//最短时间为1秒
}
long beginTime=System.currentTimeMillis();
//在他们开始结束之间要休息一段时间
int maxRandom=Constants.MAX_SERVE_TIME-Constants.MIN_SERVE_TIME;//随机时间差就是最大时间减去最小时间
long serveTime=new Random().nextInt(maxRandom)+1+Constants.MAX_SERVE_TIME;
这就是普通客户叫号!
如果普通客户没有取到任务,普通任务接着干什么事?
7.接下来我们就来写快速客户和vip客户:
如果我们还是像上面那样写的话,大家肯定就不乐意了。
为什么不这样做呢?我们把这段代码抽取出来:
我们将这些代码抽取为commonService
8.来看看整体代码:
注意不要抽成内部类的方法,这个方法应该放在 这个线程呢过的外面:
package com.isoftstone.iterview.bank;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
//只有三种号码管理器,如何表示只有三种,使用枚举
private CustomerType type=CustomerType.COMMON;//假设默认的是common
//我们得来创建一个顺序
private int windowId=1;//默认值是1
//然后获取它们的set方法
public void setType(CustomerType type) {
this.type = type;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
//那么怎么来叫号呢,用循环
while(true){
switch(type){
case COMMON:
commonService();
break;
case EXPRESS:
Integer number2=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
break;
case VIP:
Integer number3=NumberMachine.getInstance().getVipManager().fetchServiceNumber();
break;
}
}
}
});
}
private void commonService() {
String windowName="第"+windowId+"号"+type+"窗口";
System.out.println("正在获取任务");
Integer number1=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
if(number1!=null){
long beginTime=System.currentTimeMillis();
//在他们开始结束之间要休息一段时间
int maxRandom=Constants.MAX_SERVE_TIME-Constants.MIN_SERVE_TIME;//随机时间差就是最大时间减去最小时间
long serveTime=new Random().nextInt(maxRandom)+1+Constants.MAX_SERVE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number1+"个"+type+"客户服务花费了"+costTime/1000+"秒");
}else{
System.out.println("没有取到任务,先休息一秒钟嘛");
//如果没有取到任务,那么会接着不停地喊有没有普通客户要服务啊,不会,要休息一段时间。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
9.其实快速窗口和普通窗口是一样的,只是一些小地方要改一下:
除了把名字改一下之外,快速窗口休息的时间只能是最小值:
long beginTime=System.currentTimeMillis();
//int maxRandom=Constants.MAX_SERVE_TIME-Constants.MIN_SERVE_TIME;//随机时间差就是最大时间减去最小时间
//long serveTime=new Random().nextInt(maxRandom)+1+Constants.MAX_SERVE_TIME;
try {
Thread.sleep(Constants.MIN_SERVE_TIME);//快速窗口休息的时间只能是最小值
还有就是来写vip窗口的代码:
还是复制代码:
System.out.println(windowName+"没有取到任务");//这里vip窗口没有取到任务不是去休息,而是去为普通客户服务
commonService();
哦,还有快速窗口没有取到,也不是休息吧:
System.out.println(windowName+"没有取到任务");
commonService();
10.那么这ServiceWindow.java的所有的代码如下:
package com.isoftstone.iterview.bank;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
//只有三种号码管理器,如何表示只有三种,使用枚举
private CustomerType type=CustomerType.COMMON;//假设默认的是common
//我们得来创建一个顺序
private int windowId=1;//默认值是1
//然后获取它们的set方法
public void setType(CustomerType type) {
this.type = type;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
//那么怎么来叫号呢,用循环
while(true){
switch(type){
case COMMON:
commonService();
break;
case EXPRESS:
Integer number2=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
break;
case VIP:
Integer number3=NumberMachine.getInstance().getVipManager().fetchServiceNumber();
break;
}
}
}
});
}
private void commonService() {
String windowName="第"+windowId+"号"+type+"窗口";
System.out.println("正在获取任务");
Integer number1=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
if(number1!=null){
long beginTime=System.currentTimeMillis();
//在他们开始结束之间要休息一段时间
int maxRandom=Constants.MAX_SERVE_TIME-Constants.MIN_SERVE_TIME;//随机时间差就是最大时间减去最小时间
long serveTime=new Random().nextInt(maxRandom)+1+Constants.MAX_SERVE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number1+"个"+type+"客户服务花费了"+costTime/1000+"秒");
}else{
System.out.println(windowName+"没有取到任务,先休息一秒钟嘛");
//如果没有取到任务,那么会接着不停地喊有没有普通客户要服务啊,不会,要休息一段时间。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void expressService() {
String windowName="第"+windowId+"号"+type+"窗口";
System.out.println("正在获取任务");
Integer number1=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
if(number1!=null){
long beginTime=System.currentTimeMillis();
//int maxRandom=Constants.MAX_SERVE_TIME-Constants.MIN_SERVE_TIME;//随机时间差就是最大时间减去最小时间
//long serveTime=new Random().nextInt(maxRandom)+1+Constants.MAX_SERVE_TIME;
try {
Thread.sleep(Constants.MIN_SERVE_TIME);//快速窗口休息的时间只能是最小值
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number1+"个"+type+"客户服务花费了"+costTime/1000+"秒");
}else{
System.out.println(windowName+"没有取到任务");
commonService();
}
}
private void vipService() {
String windowName="第"+windowId+"号"+type+"窗口";
System.out.println("正在获取任务");
Integer number1=NumberMachine.getInstance().getVipManager().fetchServiceNumber();
if(number1!=null){
long beginTime=System.currentTimeMillis();
//在他们开始结束之间要休息一段时间
int maxRandom=Constants.MAX_SERVE_TIME-Constants.MIN_SERVE_TIME;//随机时间差就是最大时间减去最小时间
long serveTime=new Random().nextInt(maxRandom)+1+Constants.MAX_SERVE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number1+"个"+type+"客户服务花费了"+costTime/1000+"秒");
}else{
System.out.println(windowName+"没有取到任务");//这里vip窗口没有取到任务不是去休息,而是去为普通客户服务
commonService();
}
}
}
11.接着我们再写一个类:MainClass.java
package com.isoftstone.iterview.bank;
public class MainClass {
public static void main(String[] args) {
//先来看普通窗口,有四个
for(int i=1;i<5;i++){
ServiceWindow commonWindow=new ServiceWindow();
commonWindow.setWindowId(i);
commonWindow.start();
}
ServiceWindow expressWindow=new ServiceWindow();//快速窗口和vip窗口只有一个,就不用编号了
expressWindow.setWindowId(CustomerType.EXPRESS);
expressWindow.start();
ServiceWindow vipWindow=new ServiceWindow();//快速窗口和vip窗口只有一个,就不用编号了
expressWindow.setWindowId(CustomerType.VIP);
expressWindow.start();
}
}
12.现在这几个窗口都启动了,接着还有三类客户在不停地取号,那么整个程序就通了!
ServiceWindow commonWindow=new ServiceWindow();
commonWindow.setWindowId(i);
commonWindow.start();
}
ServiceWindow expressWindow=new ServiceWindow();//快速窗口和vip窗口只有一个,就不用编号了
expressWindow.setWindowId(CustomerType.EXPRESS);
expressWindow.start();
ServiceWindow vipWindow=new ServiceWindow();//快速窗口和vip窗口只有一个,就不用编号了
expressWindow.setWindowId(CustomerType.VIP);
expressWindow.start();
//我们来模拟客户取票,过一会有一个客户来了,过一会有一个客户来,我们用线程
//我们这使用的线程不是普通的线程,而是定时循环的线程,采用新技术
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number=NumberMachine.getInstance().getCommonManager().genernateNewManager();
System.out.println(number+"号客户正在等待服务!");
}
},
0,//这个参数是过多长时间来执行,这里设置为0,马上来人
1, //这个参数是以后每隔多长时间来一人,我们设置为1秒
TimeUnit.SECONDS//这个参数是时间单位,这里单位是秒
);
//这个是普通客户
//再来vip客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number=NumberMachine.getInstance().getVipManager().genernateNewManager();
System.out.println(number+"号客户正在等待服务!");
}
},
0,//这个参数是过多长时间来执行,这里设置为0,马上来人
6, //这个参数是以后每隔多长时间来一人,我们设置为6秒
TimeUnit.SECONDS//这个参数是时间单位,这里单位是秒
);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number=NumberMachine.getInstance().getExpressManager().genernateNewManager();
System.out.println(number+"号客户正在等待服务!");
}
},
0,//这个参数是过多长时间来执行,这里设置为0,马上来人
3, //这个参数是以后每隔多长时间来一人,我们设置为6秒
TimeUnit.SECONDS//这个参数是时间单位,这里单位是秒
);
}
}
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
- 黑马程序员-银行调度系统2
- 黑马程序员-银行调度系统(2)
- 黑马程序员 银行调度系统
- 黑马程序员-银行调度系统
- 黑马程序员--银行调度系统
- 黑马程序员--银行调度系统
- 黑马程序员:银行调度系统
- 黑马程序员-银行调度系统
- 黑马程序员-银行调度系统
- 黑马程序员,银行调度系统
- 黑马程序员-银行调度系统
- 黑马程序员---银行调度系统
- 黑马程序员--银行调度系统
- 黑马程序员-----银行调度系统
- 黑马程序员------银行调度系统
- 黑马程序员---银行调度系统
- 黑马程序员-银行调度系统
- 黑马程序员--银行调度系统
- sql2008 附加数据库时 错误5123
- android 获取手机自定位的几种实现方式
- 黑马程序员-银行调度系统1
- android实用代码积累
- Navicat for Mysql 注册码
- 黑马程序员-银行调度系统2
- 当当网退货流程
- Spring AOP解决系统日志备忘
- 基于mini2440的led驱动编写的总结
- expdp network_link参数
- 黑马程序员-android视频播放器
- HttpURLConnection用法详解
- java中double四舍五入并设置小数点位数的问题
- 从NFS启动TQ2440