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");