当前位置:嗨网首页>书籍在线阅读

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.创建并启动 Sensor1Sensor2 任务:

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