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

yizhihongxing

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中类的加载顺序剖析(常用于面试题)

    Java中类的加载顺序剖析 在Java中,类的加载顺序是一个很重要的概念,也是经常出现在面试题中的一个考点。本文将会详细讲解Java中类的加载顺序,并且提供相关的代码示例。 类的生命周期 在深入讲解类的加载顺序之前,我们需要先了解Java中类的生命周期。Java中类的生命周期分为五个部分:加载、验证、准备、解析、初始化。 加载:在该阶段,Java虚拟机将会从…

    Java 2023年5月26日
    00
  • Java将日期类型Date时间戳转换为MongoDB的时间类型数据

    下面是将Java中的日期类型Date时间戳转换为MongoDB的时间类型数据的完整攻略: 1. 使用Java的Date类型获取时间戳 首先,需要使用Java的Date类型获取当前的时间戳。可以使用System类中的currentTimeMillis()方法来获取当前的时间戳。示例代码如下: long timestamp = System.currentTim…

    Java 2023年5月20日
    00
  • JDBC示例代码

    JDBC(Java Database Connectivity)是 Java 中连接不同数据库并实现数据操作的 API。下面是 JDBC 示例代码的完整攻略。 环境准备 在开始编写 JDBC 代码之前,需要先完成以下步骤: 下载并安装关系型数据库(如 MySQL、Oracle 等)。以下示例以 MySQL 为例。 下载并安装 JDBC 驱动程序。可以到官网下…

    Java 2023年5月20日
    00
  • spring cloud-给Eureka Server加上安全的用户认证详解

    下面是详细的攻略过程,分为三个部分:Eureka Server的基础配置、添加Spring Security的依赖、配置Spring Security的用户认证。 基础配置 首先需要创建一个基础的Eureka Server服务,可以在pom.xml文件中直接添加以下依赖: <dependency> <groupId>org.sprin…

    Java 2023年6月3日
    00
  • java如何利用poi解析doc和docx中的数据

    当需要从 Word 文档中提取数据的时候,我们可以使用 Apache POI 来读取 “.doc” 和 “.docx” 文件。下面是如何利用 POI 解析 Word 文档中数据的攻略: 1. 添加 POI 依赖 在项目中添加以下依赖: <dependency> <groupId>org.apache.poi</groupId&g…

    Java 2023年5月20日
    00
  • 实例讲解Java批量插入、更新数据

    来详细讲解一下“实例讲解Java批量插入、更新数据”的完整攻略吧。 思路概述 在 Java 中批量插入、更新数据的基本思路是: 手动拼接 SQL 语句,将多条插入语句合并成一条; 执行批量插入、更新操作; 对于第一步手动拼接 SQL 语句,为了避免 SQL 注入,一般会使用 PreparedStatement 或 NamedParameterJdbcTemp…

    Java 2023年5月20日
    00
  • C#桥接模式完整实例

    C#桥接模式是一种软件设计模式,旨在将抽象和实现分离开来,以便它们可以独立地进行变化和演化。在此模式下,一个抽象类在其内部维护一个实现类的引用,并将具体的实现委托给实现类。这样便可以在不改变抽象类结构的情况下,改变具体实现类。 下面我们采用一个“图形和颜色”系统作为示例,在这个系统中,“图形”和“颜色”是两个独立的概念,它们可以独立从抽象和实现上进行扩展,并…

    Java 2023年5月19日
    00
  • javaweb在线支付功能实现代码

    下面是“javaweb在线支付功能实现代码”的完整攻略。 确定支付方式和接口 首先需要确定网站支持哪些支付方式,例如支付宝、微信支付等,然后根据支付方式找到相应的支付接口,例如支付宝的即时到账接口或者微信支付的统一下单接口。 创建订单 在用户确认需要支付时,需要创建对应的订单并保存到数据库中。订单包含以下信息: 订单号:唯一标识该订单 商品名称:用户购买的商…

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