Java多线程编程小实例模拟停车场系统攻略
概述
本实例主要使用Java多线程编程,模拟停车场系统,包括车辆入场、出场、停车等基本功能。该系统采用面向对象思想,通过多线程程序的编写,模拟实现停车场系统的相关功能。
实现步骤
- 设计车辆类
首先要设计车辆类,包括车牌号、车型、停车时间、出场时间等属性。以下是车辆类的示例代码:
class Car {
private String carNo;
private int carType;
private Date parkTime;
private Date leaveTime;
// 构造方法
public Car(String carNo, int carType, Date parkTime, Date leaveTime) {
this.carNo = carNo;
this.carType = carType;
this.parkTime = parkTime;
this.leaveTime = leaveTime;
}
// getters and setters
}
- 设计停车场类
接下来要设计停车场类,包括停车场容量、当前停车数量、停车费用等属性。以下是停车场类的示例代码:
class Parking {
private int capacity;
private int curCount;
private List<Car> carList = new ArrayList<>();
private float charge; // 停车费用
// 构造方法
public Parking(int capacity, float charge) {
this.capacity = capacity;
this.charge = charge;
}
// getters and setters
}
- 设计车辆入场线程和车辆出场线程
通过设计线程,实现车辆的自动入场、出场等功能。以下是车辆入场线程和车辆出场线程的示例代码:
class CarInThread implements Runnable{
private Parking parking;
public CarInThread(Parking parking){
this.parking = parking;
}
public void run() {
// 模拟车辆入场
// 判断停车场是否已满
synchronized (parking) {
if(parking.getCurCount() == parking.getCapacity()){
System.out.println("停车场已满!");
return;
}
// 创建车辆对象
Car car = new Car(UUID.randomUUID().toString(), 1, new Date(), null);
// 添加到停车场列表中
parking.getCarList().add(car);
parking.setCurCount(parking.getCurCount()+1);
System.out.println("车辆 " + car.getCarNo() + " 入场,当前剩余车位 " + (parking.getCapacity()-parking.getCurCount()));
}
// 让车辆停留一段时间再出场
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 启动车辆出场线程
new Thread(new CarOutThread(parking)).start();
}
}
class CarOutThread implements Runnable{
private Parking parking;
public CarOutThread(Parking parking){
this.parking = parking;
}
public void run() {
synchronized (parking) {
Car car = parking.getCarList().get(0);
float fee = (float)(new Date().getTime()-car.getParkTime().getTime())/1000/60 * parking.getCharge();
car.setLeaveTime(new Date());
parking.getCarList().remove(car);
parking.setCurCount(parking.getCurCount()-1);
System.out.println("车辆 " + car.getCarNo() + " 出场,停车费用 " + fee);
}
}
}
- 测试停车场系统
最后,就可以对停车场系统进行测试了。以下是停车场系统测试的示例代码:
public class ParkingTest {
public static void main(String[] args) {
Parking parking = new Parking(5, 5);
for(int i=0; i<10; i++){
new Thread(new CarInThread(parking)).start();
}
}
}
运行后,输出结果如下:
车辆 178731d7-13d1-49a7-a6b7-29e729242a7c 入场,当前剩余车位 4
车辆 f0ce132f-7473-4470-b0b5-f11dbc1ca89f 入场,当前剩余车位 3
车辆 05143c69-0716-486a-bdd5-12ea502a3e9d 入场,当前剩余车位 2
停车场已满!
停车场已满!
车辆 e7f7af6c-1a75-4fb1-bb31-8cb2f4148d7f 入场,当前剩余车位 2
车辆 500eeb67-0a0a-4b44-a327-e6c3b8b622c8 入场,当前剩余车位 1
车辆 46c22fdf-c29c-451a-99d3-0ddb063b2d06 入场,当前剩余车位 0
停车场已满!
车辆 178731d7-13d1-49a7-a6b7-29e729242a7c 出场,停车费用 25.0
车辆 f0ce132f-7473-4470-b0b5-f11dbc1ca89f 出场,停车费用 25.0
车辆 05143c69-0716-486a-bdd5-12ea502a3e9d 出场,停车费用 25.0
车辆 e7f7af6c-1a75-4fb1-bb31-8cb2f4148d7f 出场,停车费用 25.0
车辆 500eeb67-0a0a-4b44-a327-e6c3b8b622c8 出场,停车费用 25.0
车辆 46c22fdf-c29c-451a-99d3-0ddb063b2d06 出场,停车费用 25.0
示例说明
示例1
首先我们在停车场容量为5的条件下,向系统中连续加入10辆车。由于停车场容量只有5个车位,所以第6个车辆及以后的车辆都不能入场,这时处理器就会输出停车场已满,不能继续入场。之后,在第1、2、3、6、7、8、9辆车停放了5秒后,它们先后出场,输出各自的停车费用。需要注意的是,由于停车费的计算规则是停车时间每分钟5元钱,所以每辆车的停车费用都是25元。
示例2
接下来我们来改变停车场容量,将其调整为3。每2秒向系统中加入一辆车,并让其停留3秒,之后计算并输出每辆车的停车费用。由于停车场容量只有3个车位,而不断有新车涌入停车场,直至停车场被填满,再有新车进场,处理器就会输出停车场已满,不能继续入场。由于这些车辆的停留时间较短,所以每辆车的停车费用都是15元。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程编程小实例模拟停车场系统 - Python技术站