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 中限制方法的返回时间最新方法

    下面我将详细讲解“Java 中限制方法的返回时间最新方法”的完整攻略。 1. 背景 在某些场景下,我们需要限制某些方法的返回时间,以避免对系统资源的过度占用或者对用户造成不良体验等问题。 然而,Java 原生并没有提供限制方法返回时间的接口或者关键字,因此我们需要通过一些技巧来实现这个功能。 2. 解决方案 2.1 使用 ExecutorService 实现…

    Java 2023年5月20日
    00
  • Linux CentOS服务器搭建与初始化配置教程

    让我详细讲解一下“Linux CentOS服务器搭建与初始化配置教程”的完整攻略。以下是整个过程的步骤和详细说明: 步骤一:安装CentOS系统 在服务器上插入CentOS的安装光盘或者USB启动盘,并按照引导安装系统。 在安装过程中需要选择安装的语言、时区等信息,可以根据需要进行设置。 分区时建议将/boot、/home、/var、/usr、/tmp、/ …

    Java 2023年6月15日
    00
  • Java序列化的作用是什么?

    Java序列化是指将Java对象转换为字节流的过程,以便将其存储在文件中、在网络上传输或将其传递给其他进程。Java序列化的作用是可以在不同的系统和平台之间传输对象,使其具有通用性和可重用性。 在Java中,我们可以使用Serializable接口将一个对象序列化为字节流,然后在需要时将其重新反序列化回到原始对象。以下是使用Java序列化的几个步骤: 实现可…

    Java 2023年5月11日
    00
  • Java 如何将网络资源url转化为File文件

    将网络资源URL转换为File文件需要借助Java中的IO流和网络操作类。下面将会详细介绍Java如何将网络资源URL转化为File文件的完整攻略。 步骤一:获取URL 首先要获取网络资源的URL,可以使用Java中的URL类。以下示例演示如何获取指定URL的网络资源: import java.net.*; public class GetUrlConten…

    Java 2023年5月19日
    00
  • 如何在JAVA中使用Synchronized

    当多个线程尝试访问共享资源时,会造成数据竞争的问题,导致程序出现意想不到的结果。Java的Synchronized关键字可以协调多个线程之间对共享资源的访问,保证线程的安全性。下面是如何使用Synchronized关键字的攻略。 为什么需要使用Synchronized 当多个线程同时访问共享资源时,由于竞争条件的存在,可能会导致数据的不一致和计算结果的错误,…

    Java 2023年5月26日
    00
  • 详解JVM的内存对象介绍[创建和访问]

    详解JVM的内存对象介绍[创建和访问] 简介 JVM(Java Virtual Machine)是一个虚拟机,它是Java程序运行的环境。在JVM中,所有的变量、对象都是存储在内存中的。本文将介绍JVM中的内存对象创建和访问的过程和相关知识点。 JVM内存分区 JVM中的内存分为三个部分: 堆(Heap):用于存储对象以及数组等数据。堆是Java运行时的主要…

    Java 2023年5月26日
    00
  • 解决dubbo错误ip及ip乱入问题的方法

    解决dubbo错误ip及ip乱入问题的方法 在使用dubbo进行微服务开发时,可能会出现一些ip相关的问题,如服务提供者使用了错误的ip地址进行暴露,或者消费者调用时使用了错误的ip地址等等。这些问题会导致服务无法正常运行。本攻略将介绍如何解决dubbo错误ip及ip乱入问题。 Dubbo服务提供者使用了错误的ip地址进行暴露 在dubbo的服务提供者端,可…

    Java 2023年6月2日
    00
  • 关于feign.codec.DecodeException异常的解决方案

    当使用Spring Cloud Feign调用外部服务时,如果接口返回的数据不能按照指定的数据类型进行反序列化,就会抛出feign.codec.DecodeException异常。那么,在实际开发过程中,我们如何解决这个异常呢? 下面是几种解决方案。 方案一:自定义错误解码器 我们可以定义一个自己的错误解码器,当外部服务返回的数据无法按照指定数据类型反序列化…

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