Java多线程编程小实例模拟停车场系统

Java多线程编程小实例模拟停车场系统攻略

概述

本实例主要使用Java多线程编程,模拟停车场系统,包括车辆入场、出场、停车等基本功能。该系统采用面向对象思想,通过多线程程序的编写,模拟实现停车场系统的相关功能。

实现步骤

  1. 设计车辆类

首先要设计车辆类,包括车牌号、车型、停车时间、出场时间等属性。以下是车辆类的示例代码:

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
}
  1. 设计停车场类

接下来要设计停车场类,包括停车场容量、当前停车数量、停车费用等属性。以下是停车场类的示例代码:

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
}
  1. 设计车辆入场线程和车辆出场线程

通过设计线程,实现车辆的自动入场、出场等功能。以下是车辆入场线程和车辆出场线程的示例代码:

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);
        }
    }
}
  1. 测试停车场系统

最后,就可以对停车场系统进行测试了。以下是停车场系统测试的示例代码:

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技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java将String字符串转换为List类型实例方法

    这里是将String字符串转换为List类型实例方法的详细攻略。 第一步:导入Java的util库 import java.util.*; 第二步:定义一个静态方法将String字符串转化为List public static List<Long> convertStringToList(String inputString) { List&lt…

    Java 2023年5月26日
    00
  • Maven Repository仓库的具体使用

    Maven是Java项目中流行的构建工具,常用于自动化构建、依赖管理等操作。而Maven Repository(Maven仓库)则是Maven中可用依赖(dependency)和插件(plugin)的存储位置。在Maven项目中,需要使用某个依赖或插件时,Maven会去检查Repository中是否已经存在该资源,如果有则进行下载,否则会给出错误提示。本文将…

    Java 2023年6月2日
    00
  • js插件YprogressBar实现漂亮的进度条效果

    下面是详细的“js插件YprogressBar实现漂亮的进度条效果”的完整攻略。 什么是 YprogressBar YprogressBar 是一个基于 jQuery 的 JavaScript 插件,用于实现网页进度条效果。它可以让进度条随着页面的加载而不断变化,既简单又漂亮,非常适合用于页面加载、文件上传等场合。 YprogressBar 的使用步骤 步骤…

    Java 2023年6月16日
    00
  • Java创建线程及配合使用Lambda方式

    创建线程 在 Java 中,创建线程主要有两种方式:继承 Thread 类和实现 Runnable 接口。 继承 Thread 类 继承 Thread 类是最简单的一种创建线程的方式,在继承 Thread 类后,需要重写 run 方法,在 run 方法中编写需要执行的代码。然后创建一个线程实例并调用 start 方法,这个方法会启动一个新线程,并且会自动调用…

    Java 2023年5月18日
    00
  • weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法

    WebLogic服务建立数据源连接测试 为了使WebLogic Server能够连接到数据库中的数据,您需要在WebLogic Server上设置数据源。以下是设置数据源的步骤: 步骤1:登录WebLogic控制台 首先,您需要打开WebLogic Server的管理控制台。在Web浏览器中输入URL(如http://localhost:7001/conso…

    Java 2023年5月20日
    00
  • SpringBoot Mail邮件任务详情

    Spring Boot Mail邮件任务详情 在Spring Boot中,我们可以使用Mail模块来实现邮件发送功能。本文将详细讲解Spring Boot Mail邮件任务的完整攻略,并提供两个示例。 1. 配置邮件发送信息 以下是配置邮件发送信息的基本流程: 在application.properties或application.yml文件中添加以下内容:…

    Java 2023年5月15日
    00
  • java之使用stream对日期排序方式

    下面是对Java中使用Stream对日期排序的攻略。 1. 准备数据 在讲解如何使用Stream对日期排序之前,我们需要准备一些数据。假设我们有一个List集合,其中包含多个日期对象。如下所示: List<LocalDate> dates = Arrays.asList( LocalDate.of(2021, 8, 1), LocalDate.o…

    Java 2023年5月20日
    00
  • Java Hibernate中的查询策略和抓取策略

    Java Hibernate中的查询策略和抓取策略是提高数据访问性能的关键。查询策略指的是在何时加载关联实体,而抓取策略则指的是如何在单次数据库查询中获取实体之间的关联关系。这里将介绍几种常见的查询策略和抓取策略,并提供示例。 Hibernate中的查询策略 (1)立即加载(EAGER) 立即加载策略是Hibernate默认的策略。这种策略会在查询主实体时立…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部