能够同时进出车 可直接运行的基于Java多线程的停车场管理系统

文章目录写代码前对一些问题的思考 整体思路分析及源码 总结
基本要求
提示:以下是本篇文章正文内容,下面案例可供参考
需要实现的基本类1.Car类:2.类3.Park类写代码前对一些问题的思考 1.什么是单例?在该系统中应该如何实现?
单例:保证整个系统中一个类只有一个对象的实例
在本系统中使用CAS实现单例,这样线程会比较安全
代码如下(示例):
public class Park implements Serializable {/*** 利用AtomicReference*/private static final AtomicReference INSTANCE = new AtomicReference();/*** 私有化*//*** 用CAS确保线程安全*/public static final Park getInstance() {for (; ; ) {Park current = INSTANCE.get();if (current != null) {return current;}current = new Park();if (INSTANCE.compareAndSet(null, current)) {return current;}}}public Park() {this(6);}private Park(int maxSize) {this.maxSize = maxSize;}
2.如何使用多线程模拟只有一个出口一个入口
在这里我是在Park类里面再写入两个内部类,然后再让内部类实现接口,分别重写run()方法,在run方法内分别调用不同的方法(即exit与enter方法)
代码如下(看不懂没事,看最后的源码就应该会懂了):
//出库的内部类private class Exit implements Runnable {@Overridepublic void run() {exit(exitCars);}}//入库的内部类private class Enter implements Runnable {@Overridepublic void run() {enter();}}
3.怎样保证容器线程的安全?
我这里是使用来代替来确保容器的安全,并且在运行的时候尽量去避免对车库进行操作,而是先将要入库即出库的车分别存在另外两个容器,调用出库/入库线程时再将其从车库中添加/删除
代码如下(一小部分可能无法理解用意):
//存储进入车库的车private static List lists = new CopyOnWriteArrayList();//存储想要出库的车private static List exitCars = new CopyOnWriteArrayList();//存储想要入库的车private static List enterCars = new CopyOnWriteArrayList();
4.如何将对象反序列化到文件,如何从文件中反序列化?
此处是让我最烧脑的地方了,因为类里面还包含着Car类的,因此存入文件并不是那么顺利,总是碰壁,希望我的经验能够让你们少碰壁,在java中存一个类容易,但是如果这个类里面还包含着类,那就有点小麻烦了(过两天再编辑一下,告诉你们如何处理,也可以先看源码自行理解)
整体思路分析及源码
提示:整体思路分析由于本人时间并不充足,因此在源码内添加了注释,应该都还是很好理解的,等我过段时间有空了会一起将序列化与反序列化遇到的问题以及源码分析一起分析给大家 。(建议大家可以将源码复制到编译器中,这样便于理解,也可以自行debug分析)
源码:
(记得自行将包名修改一下)
Car类:
package BigTest;import java.io.Serializable;/*抽象类,所有车型的基类有3个String类型的字段(品牌,型号,车牌)品牌和型号又子类初始化,且不可改变,车牌由构造方法给出要求重写以下3个方法blic int hashCode() {} public boolean equals(Object obj) {} public String toString() {}*/public abstract class Car implements Serializable {private String number;private final String brand = initBrand();//最终属性不能够修改private final String model = initModel();Car() {}protected abstract String initBrand();protected abstract String initModel();public Car(String number) {this.number = number;}public String getNumber() {return number;}public String getBrand() {return brand;}public String getModel() {return model;}@Overridepublic int hashCode() {//判断两个对象是否相同int result;result = this.getNumber().hashCode() + this.getBrand().hashCode() + this.getModel().hashCode();return result;}@Overridepublic boolean equals(Object obj) {//一段时间内,一辆车在出来之前,只能进入一次停车场,判断输入的车辆信息是否有重复,有重复的话只输入一次if (obj.hashCode() == this.hashCode())return true;elsereturn false;}@Overridepublic String toString() {//将车辆信息返回成一个字符串,包括车牌号,车型,商标 。String abc = "车牌号:" + this.getNumber() + " 车型:" + this.getModel() + " 商标:" + this.getBrand();return abc;}public void printinformation() {String abc = this.toString();System.out.println(abc);}}