按以下要求编写java多线程程序: (1)有一辆公交车,乘客座位数为30座,假设前后两个车门都能上车,每次从某一个门上车1个人。 (2)在主类ThreadTest.java中创建2个线程并取名“前门”、“后门”,分别模拟在前/后门上车,假设每隔100~200毫秒内的随机时间上车。 (3)如果坐满则不能再上车。请模拟上车过程并且打印出是从哪个车门上车以及剩下的座位数。
时间: 2024-03-23 21:44:09 浏览: 63
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口(csdn)————程.pdf
以下是实现该多线程程序的Java代码:
```
public class ThreadTest {
public static void main(String[] args) {
Bus bus = new Bus(30); // 创建一辆座位数为30的公交车
Thread frontDoorThread = new Thread(new PassengerGenerator(bus, "前门"));
Thread backDoorThread = new Thread(new PassengerGenerator(bus, "后门"));
// 创建两个线程分别模拟在前门和后门上车
frontDoorThread.setName("前门");
backDoorThread.setName("后门");
frontDoorThread.start(); // 启动前门线程
backDoorThread.start(); // 启动后门线程
}
}
class Bus {
private int seatCount; // 座位数
private int passengerCount; // 乘客数
public Bus(int seatCount) {
this.seatCount = seatCount;
this.passengerCount = 0;
}
public synchronized boolean canGetOn() {
return passengerCount < seatCount; // 如果还有座位,则可以上车
}
public synchronized void getOn() {
passengerCount++; // 上车
System.out.println(Thread.currentThread().getName() + " 上车,剩余座位数:" + (seatCount - passengerCount));
}
}
class PassengerGenerator implements Runnable {
private Bus bus;
private String door;
public PassengerGenerator(Bus bus, String door) {
this.bus = bus;
this.door = door;
}
@Override
public void run() {
while (true) {
if (bus.canGetOn()) { // 如果还有座位,则可以上车
bus.getOn(); // 上车
} else {
System.out.println("车已满,无法再上车!");
break;
}
try {
Thread.sleep((int) (Math.random() * 101 + 100)); // 随机等待100~200毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(door + "线程结束!");
}
}
```
程序中,我们创建了一个`Bus`类来表示公交车,其中包括座位数和乘客数两个属性,以及`canGetOn()`和`getOn()`两个方法分别用于判断是否可以上车和上车操作。
然后,我们创建了一个`PassengerGenerator`类,实现了`Runnable`接口,用于模拟在前门或后门上车的乘客。
最后,在`ThreadTest`主类中,我们创建了两个线程分别模拟在前门和后门上车,然后启动这两个线程。
当有乘客上车时,我们调用`Bus`对象的`canGetOn()`方法判断是否还有座位,如果有,则调用`getOn()`方法上车。
如果座位已满,则输出提示信息并跳出循环,同时打印出是从哪个车门上车以及剩余座位数。
整个程序采用了同步机制,避免了多个乘客同时上车导致数据错误的问题。
阅读全文