按以下要求编写java多线程程序: (1)有一辆公交车,乘客座位数为30座,假设前后两个车门都能上车,每次从某一个门上车1个人。 (2)在主类ThreadTest.java中创建2个线程并取名“前门”、“后门”,分别模拟在前/后门上车,假设每隔100~200毫秒内的随机时间上车。 (3)如果坐满则不能再上车。请模拟上车过程并且打印出是从哪个车门上车以及剩下的座位数。 例如某次运行结果如下: 前门有人上车,还剩29个座位 前门有人上车,还剩28个座位 后门有人上车,还剩27个座位 后门有人上车,还剩26个座位 前门有人上车,还剩25个座位 ......
时间: 2024-03-14 21:44:01 浏览: 111
以下是按照要求编写的Java多线程程序:
```java
public class ThreadTest {
public static void main(String[] args) {
Bus bus = new Bus();
Thread frontDoor = new Thread(new Passenger(bus, "前门"));
Thread backDoor = new Thread(new Passenger(bus, "后门"));
frontDoor.setName("前门");
backDoor.setName("后门");
frontDoor.start();
backDoor.start();
}
}
class Bus {
private int seat;
private final int maxSeat = 30;
public Bus() {
seat = 0;
}
public synchronized boolean getOn(String door) {
if (seat < maxSeat) {
seat++;
System.out.println(door + "有人上车,还剩" + (maxSeat - seat) + "个座位");
return true;
} else {
System.out.println("已经坐满了," + door + "不能再上车");
return false;
}
}
}
class Passenger implements Runnable {
private Bus bus;
private String door;
public Passenger(Bus bus, String door) {
this.bus = bus;
this.door = door;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep((int) (100 + Math.random() * 100));
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!bus.getOn(door)) {
break;
}
}
}
}
```
程序中定义了一个 `Bus` 类表示公交车,它有一个 `seat` 属性表示当前已经坐的座位数,以及一个 `getOn` 方法表示上车。`getOn` 方法使用 `synchronized` 关键字修饰,保证了线程安全。
程序中还定义了一个 `Passenger` 类表示乘客,它有一个 `door` 属性表示从哪个门上车,它的 `run` 方法表示乘客上车的过程。
在主方法中,创建了一个公交车和两个乘客线程,分别表示前门和后门。每个乘客线程会在 `run` 方法中模拟等待一段时间后上车,上车过程中调用 `Bus` 类的 `getOn` 方法,如果返回 `false` 表示公交车已经坐满,乘客就不再上车了。
阅读全文