- ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
- 设置一个类,表示控制取出和生成票
package cn.itheima.bank;
import java.util.ArrayList;
import java.util.List;
//所有的挂号票
public class Numbers {
private int QueueNum = 0;//设置有一个计数器,记录队列票数
private List<Integer> QueueNumsList = new ArrayList<Integer>();//设置一个集合,方便拿取票
//拿走一张票,表示正在排队
public synchronized Integer generateNum(){
QueueNumsList.add(++QueueNum);
return QueueNum;
}
//取走一个票,表示正在服务客户
public synchronized Integer serviceNum(){
if(QueueNumsList.size() > 0){
return QueueNumsList.remove(0);
}else{
return null;
}
}
}
- 自动票挂号机,管理所有的票
package cn.itheima.bank;
public class NumberMachine {
private NumberMachine(){};
private static NumberMachine numberMachine = new NumberMachine();
public static NumberMachine getInstance(){
return numberMachine;
}
//保证各个类型窗口操作的都是对应类型的客户
private Numbers ordinaryNum = new Numbers();
private Numbers fastNum = new Numbers();
private Numbers vipNum = new Numbers();
public Numbers getOrdinary(){
return ordinaryNum;
}
public Numbers getFastNum(){
return fastNum;
}
public Numbers getVipNum(){
return vipNum;
}
}
- 枚举,设置三种窗口类型,并且覆盖toString方法
package cn.itheima.bank;
public enum CustomerType {
ORDINARY, FAST, VIP;
@Override
public String toString(){
String name = null;
switch(this){
case ORDINARY:
name = "普通";
break;
case FAST:
name = "快速";
break;
case VIP:
name = name();
break;
}
return name;
}
}
- 设置各个售票窗口
package cn.itheima.bank;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindows {
private CustomerType customer = CustomerType.ORDINARY;//设置一个枚举,设置只能有三种票的类型
private int num = 1;//设置一个窗口记录器
public CustomerType getCustomer() {
return customer;
}
public void setCustomer(CustomerType customer) {
this.customer = customer;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
while(true){
switch(customer){
case ORDINARY://如果是普通窗口,那么寻找对应的窗口开启
ordinaryService();
break;
case FAST:
fastService();
break;
case VIP:
VIPService();
break;
}
}
}
});
}
private void ordinaryService(){
System.out.println(num+"号普通窗口正在获取任务...");
//从自动挂号机那里拿到普通票
Integer serviceNum = NumberMachine.getInstance().getOrdinary().serviceNum();
if(serviceNum != null){
//如果有票,那么显示正在服务的人
System.out.println(num+"号"+customer+"窗口正在为"+serviceNum+"号"+customer+"客户服务...");
long time = new Random().nextInt(9000)+1000;
try {
Thread.sleep(time);//设定为客户服务的时间,1到10秒
} catch (InterruptedException e) {
e.printStackTrace();
}
//显示为客户服务的时间
System.out.println(num+"号普通窗口为"+serviceNum+"号普通客户服务完成,耗时"+(int)time/1000+"秒");
}else{
//如果没有拿到票,那么空闲一秒
System.out.println(num+"号"+customer+"窗口,没有获取到普通客户,空闲1秒中...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void fastService(){
System.out.println(num+"号快速窗口正在获取任务...");
//从自动挂号机那里拿到快速票
Integer serviceNum = NumberMachine.getInstance().getFastNum().serviceNum();
if(serviceNum != null){
System.out.println(num+"号"+customer+"窗口正在为"+serviceNum+"号"+customer+"客户服务...");
long time = new Random().nextInt(9000)+1000;
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(num+"号"+customer+"窗口为"+serviceNum+"号"+customer+"客户服务完成,耗时"+(int)time/1000+"秒");
}else{
//如果没有快速客户,那么去接单普通客户
System.out.println(num+"号快速窗口,没有获取到快速客户,正在获取普通客户...");
ordinaryService();
}
}
private void VIPService(){
System.out.println(num+"号VIP窗口正在获取任务...");
//从自动挂号机那里拿到VIP票
Integer serviceNum = NumberMachine.getInstance().getVipNum().serviceNum();
if(serviceNum != null){
System.out.println(num+"号"+customer+"窗口正在为"+serviceNum+"号"+customer+"客户服务...");
long time = new Random().nextInt(9000)+1000;
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(num+"号"+customer+"窗口为"+serviceNum+"号"+customer+"客户服务完成,耗时"+(int)time/1000+"秒");
}else{
//如果没有VIP客户,那么去接单普通客户
System.out.println(num+"号VIP窗口,没有获取到VIP客户,正在获取普通客户...");
ordinaryService();
}
}
}
- 模拟客户排队取票,并运行程序
package cn.itheima.bank;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MianText {
public static void main(String[] args) {
//设置4个普通窗口,并且编号
for(int i=1; i<5; i++){
ServiceWindows windows1 = new ServiceWindows();
windows1.setNum(i);
windows1.start();
}
//设置一个快速窗口
ServiceWindows windows2 = new ServiceWindows();
windows2.setCustomer(CustomerType.FAST);
windows2.start();
//设置一个VIP窗口
ServiceWindows windows3 = new ServiceWindows();
windows3.setCustomer(CustomerType.VIP);
windows3.start();
//使用Executors模拟普通客户源源不断的取票
Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(
new Runnable() {
@Override
public void run() {
//从NumberMachine那里取到普通票
Integer num = NumberMachine.getInstance().getOrdinary().generateNum();
System.out.println("第"+num+"号普通客户正在等待服务!!!");
}
},
0,
1,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(
new Runnable() {
@Override
public void run() {
//从NumberMachine那里取到快速票
Integer num = NumberMachine.getInstance().getFastNum().generateNum();
System.out.println("第"+num+"号快速客户正在等待服务!!!");
}
},
0,
2,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(
new Runnable() {
@Override
public void run() {
//从NumberMachine那里取到VIP票
Integer num = NumberMachine.getInstance().getVipNum().generateNum();
System.out.println("第"+num+"号VIP客户正在等待服务!!!");
}
},
0,
6,
TimeUnit.SECONDS);
}
}