黑马程序员-银行调度系统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 ifelse if,还不如用switch-caseswitch里面必须是整形的。

这里有点小麻烦了!

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>、期待与您交流! ----------------------

原创粉丝点击