36-案例实现
案例实现
1.创建一个 ParkingCounter 类并扩展 AtomicInteger 类:
public class ParkingCounter extends AtomicInteger {
2.声明一个 int 类型的 maxNumber 私有字段来存储允许进入停车场的最大车辆数量:
private final int maxNumber;
3.实现该类的构造方法以初始化其字段:
public ParkingCounter(int maxNumber){
set(0);
this.maxNumber=maxNumber;
}
4.实现 carIn() 方法。如果停车场内汽车的数量小于设置的最大值,则该方法增加汽车的计数值。构造一个无限循环并使用 get() 方法获取内部计数值:
public boolean carIn() {
for (;;) {
int value=get();
5.如果该值等于 maxNumber 字段值,则计数值不能递增(停车场已满这时汽车不能进入)。在这种情况下,该方法返回 false 值:
if (value==maxNumber) {
System.out.printf("ParkingCounter: The parking lot is full.\n");
return false;
6.否则,递增该值并使用 compareAndSet() 方法更改旧值。此方法返回 false 值。由于计数值没有递增,因此必须再次开始循环。如果它返回 true ,则表示它已经进行了更改,然后才返回 true 值:
} else {
int newValue=value+1;
boolean changed=compareAndSet(value,newValue);
if (changed) {
System.out.printf("ParkingCounter: A car has entered.\n");
return true;
}
}
}
}
7.实现 carOut() 方法。如果停车场内汽车的数量大于0,则此方法将递减汽车的计数值。构造一个无限循环并使用 get() 方法获取内部计数值:
public boolean carOut() {
for (;;) {
int value=get();
if (value==0) {
System.out.printf("ParkingCounter: The parking lot is
empty.\n");
return false;
} else {
int newValue=value-1;
boolean changed=compareAndSet(value,newValue);
if (changed) {
System.out.printf("ParkingCounter: A car has gone out.\n");
return true;
}
}
}
}
8.创建一个 Sensor1 类,实现 Runnable 接口:
public class Sensor1 implements Runnable {
9.声明一个 ParkingCounter 类型的 counter 私有字段:
private final ParkingCounter counter;
10.实现该类的构造方法以初始化其属性:
public Sensor1(ParkingCounter counter) {
this.counter=counter;
}
11.实现 run() 方法。多次调用 carIn() 和 carOut() 操作:
@Override
public void run() {
counter.carIn();
counter.carIn();
counter.carIn();
counter.carIn();
counter.carOut();
counter.carOut();
counter.carOut();
counter.carIn();
counter.carIn();
counter.carIn();
}
12.创建一个 Sensor2 类,实现 Runnable 接口:
public class Sensor2 implements Runnable {
13.声明一个 ParkingCounter 类型的 counter 私有字段:
private ParkingCounter counter;
14.实现该类的构造方法以初始化其字段:
public Sensor2(ParkingCounter counter) {
this.counter=counter;
}
15.实现 run() 方法。多次调用 carIn() 和 carOut() 操作:
@Override
public void run() {
counter.carIn();
counter.carOut();
counter.carOut();
counter.carIn();
counter.carIn();
counter.carIn();
counter.carIn();
counter.carIn();
counter.carIn();
}
16.创建一个 Main 类和 main() 方法来实现本案例的主类:
public class Main {
public static void main(String[] args) throws Exception {
17.创建一个 ParkingCounter 类型的 counter 对象:
ParkingCounter counter=new ParkingCounter(5);
18.创建并启动 Sensor1 和 Sensor2 任务:
Sensor1 sensor1=new Sensor1(counter);
Sensor2 sensor2=new Sensor2(counter);
Thread thread1=new Thread(sensor1);
Thread thread2=new Thread(sensor2);
thread1.start();
thread2.start();
19.等待两项任务执行完成:
thread1.join();
thread2.join();
20.在控制台中打印计数器的实际值:
System.out.printf("Main: Number of cars: %d\n",counter.get());
21.在控制台上打印一条表示程序结束的消息:
System.out.printf("Main: End of the program.\n");