假设车库有三个车位可以停车,使用 boolean[] 数组来表示车库,写一个程序模拟多个用户开车离开、停车入库的效果。注意:车位有车的时候不能停车。
首先,分析这是个多线程的问题,多线程的对象是停车与开车。
其次,有没有涉及到共享的数据。有,boolean[] 数组表示的车位。
最后,有没有涉及到线程的通信问题。有,当车满了的时候,要让停车线程等待。车空的时候要让开车线程等待。
以下是我实现的代码:
class parkingLot{//停车场作为一个类,其中包括各种方法以及车位的boolean[] 数组
boolean[] sites = {true,true,true};//true表示可以停车(车位空)
private boolean isFull(){//判断车位是否停满
int e=0;
for(int i=0;i<3;i++){
if(!sites[i])
e++;
}
return e==3;
}
private boolean isEmpty(){//判断车位是否全空
int e=0;
for (int i = 0; i < 3; i++) {
if(sites[i])
e++;
}
return e==3;
}
private int whichIsEmpty(){//判断哪个车位是空的,我认为也可以实现随机停车的效果,只需要使用Math类下的随机数方法
for(int i=0;i<3;i++)
if(sites[i])
return i;
return -1; //这个return其实没用,但是如果没有的话会报错
}
private int whichIsFull(){//判断哪个是车位不是空的,我认为也可以实现随机开车的效果,只需要使用Math类下的随机数方法
for(int i=0;i<3;i++)
if(!sites[i])
return i;
return -1; //这个return其实没用,但是如果没有的话会报错
}
public synchronized void park(){//停车的同步方法,先判断是否全满,若是,则线程等待
if(isFull()){
try {
System.out.println("车满了!");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else{
int num = whichIsEmpty();
System.out.println("++++++++"+Thread.currentThread().getName() + "停在了" + num + "车位"+"++++++++");
sites[num] = false;
notifyAll();
}
}
public synchronized void drive(){//开车的同步方法,先判断是否全空,若是,则线程等待
if(isEmpty()){
try {
System.out.println("车位空了!");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else{
int num = whichIsFull();
System.out.println("--------"+Thread.currentThread().getName()+"开走了停在"+num+"的车位"+"--------");
sites[num] = true;
notifyAll();
}
}
}
class park implements Runnable{//停车的Runnable实现类
private parkingLot pl;