用编写多线程应用程序,模拟多个人通过一个山洞,这个山洞每次只能通过一个人,每个人通过山洞的时间为5秒。随机生成10个人,同时准备过此山洞,*显示一下每次通过山洞人的姓名。
时间: 2024-12-15 14:23:03 浏览: 12
为了模拟这种场景,你可以使用Java语言编写一个多线程程序。我们可以创建一个`Person`类作为人员的基本模型,包含姓名和过山洞的函数。然后创建一个名为`Tunnel`的类代表山洞,它维护一个队列来存储等待的人,并控制谁可以进入。
```java
import java.util.concurrent.*;
import java.util.Random;
class Person {
private String name;
private volatile boolean isInTunnel = false; // 标记是否在山洞中
public Person(String name) {
this.name = name;
}
public void startClimbing() {
new Thread(() -> {
try {
while (!isInTunnel) { // 等待进入山洞
Thread.sleep(100); // 模拟等待时间
}
System.out.println(Thread.currentThread().getName() + " started climbing (" + name + ")");
isInTunnel = true; // 进入山洞
try {
Thread.sleep(5000); // 模拟过山洞时间
} catch (InterruptedException e) {
e.printStackTrace();
}
isInTunnel = false; // 出山洞
System.out.println(Thread.currentThread().getName() + " finished climbing (" + name + ")");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
public class Tunnel {
private final Queue<Person> queue = new LinkedList<>();
private int current climberIndex = -1;
public synchronized void addPerson(Person person) {
queue.add(person);
if (currentClimberIndex == -1) {
currentClimberIndex = 0;
person.startClimbing();
}
}
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < 10; i++) {
Person person = new Person("Person" + i);
new Thread(() -> {
System.out.println("Adding " + person.getName() + " to the queue");
new Tunnel().addPerson(person);
}).start();
}
}
}
```
在这个例子中,我们使用了`Thread.sleep()`模拟等待时间和过山洞的实际时间。注意,由于并发访问,`Person`类中的`isInTunnel`字段使用了`volatile`关键字保证可见性。每个新加入的人都会立即开始等待,一旦当前正在过山洞的人完成,就会唤醒并替换下一个人。
阅读全文