使用线程池和Semaphore模拟停车场停车系统

需积分: 6 0 下载量 136 浏览量 更新于2024-08-05 收藏 71KB DOCX 举报
"模拟停车场停车系统使用Java线程池和Semaphore实现" 在本文中,我们将深入探讨如何使用Java编程语言来模拟一个简单的停车场系统。这个系统的核心在于利用线程池(ExecutorService)来管理并发的车辆进出,并通过Semaphore类来控制停车场的车位数量。 首先,停车场有3个车位,当车位被占用时,其他车辆无法进入。在这个模拟系统中,我们使用了`java.util.concurrent.Semaphore`类来实现车位的管理。Semaphore是一个计数信号量,它可以用来限制同时访问特定资源的线程数量。在这里,我们将Semaphore的初始许可数设置为3,代表停车场的3个车位。 ```java Semaphore sp = new Semaphore(3); // 3个停车位 ``` 接着,我们创建了一个固定大小的线程池`ExecutorService`,大小为3,这与停车场车位数相同,目的是确保同一时间最多只有3辆车可以进行停车操作。 ```java ExecutorService che = Executors.newFixedThreadPool(3); ``` 然后,我们创建了User类,该类继承自Thread,表示每一个车主。每个User对象都有一个名字和一个Semaphore实例,分别代表车主信息和对应的车位资源。 ```java class User extends Thread { private String name; private Semaphore sp; public User(String name, Semaphore sp) { this.name = name; this.sp = sp; } // ... } ``` 在User类中,我们需要重写run方法来实现停车逻辑。当车辆想要停车时,它会尝试获取Semaphore的一个许可。如果许可可用,车辆就可以进入并占用一个车位,否则将等待直到有车位空出。离开停车场时,车辆会释放一个许可,让其他车辆有机会停车。 ```java @Override public void run() { try { sp.acquire(); // 尝试获取许可,进入停车场 System.out.println(name + "已进入停车场"); // 停车耗时模拟 TimeUnit.SECONDS.sleep(1); System.out.println(name + "已离开停车场"); } catch (InterruptedException e) { e.printStackTrace(); } finally { sp.release(); // 离开时释放许可,释放车位 } } ``` 在主函数中,我们创建了多个User线程并提交给线程池执行,模拟多个车主尝试进入停车场的情况。 ```java che.submit(newUser("李车主," + "车牌66666" + "号", sp)); // ... 创建其他车主的线程 ``` 最后,我们需要关闭线程池以避免资源泄露。 ```java che.shutdown(); ``` 总结来说,这个模拟停车场停车的示例展示了如何使用Java并发工具类来处理并发问题。Semaphore作为资源计数器,控制了车辆对停车位的访问;而ExecutorService则提供了线程的管理和调度,使得多辆车可以并发地进行停车和离开操作。这种设计思路在实际的并发编程中非常常见,可以应用于各种资源有限的场景。