编写多线程程序,五个人过山洞,山洞一次只能过一个人,一个人通过需要五秒,当一个人完全通过之后,下一个人才能进洞。
时间: 2024-02-24 09:59:14 浏览: 65
好的,这是一个比较简单的多线程问题,可以通过使用Java的线程和锁机制来解决。以下是一个可能的解决方案:
```java
public class Cave {
private boolean isOccupied = false; // 是否有人在山洞里
private int count = 0; // 过洞人数计数器
public synchronized void enter() {
while (isOccupied) { // 当前有人在山洞里则等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
isOccupied = true; // 标记山洞被占用
count++; // 过洞人数加1
System.out.println(Thread.currentThread().getName() + " enter, count: " + count);
}
public synchronized void leave() {
isOccupied = false; // 标记山洞空闲
System.out.println(Thread.currentThread().getName() + " leave");
notifyAll(); // 通知其他等待线程
}
}
public class Person extends Thread {
private Cave cave;
public Person(String name, Cave cave) {
super(name);
this.cave = cave;
}
public void run() {
try {
Thread.sleep(5000); // 模拟通过山洞需要5秒的时间
cave.leave(); // 离开山洞
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Cave cave = new Cave();
for (int i = 1; i <= 5; i++) {
new Person("Person " + i, cave).start();
}
}
}
```
在上面的代码中,Cave类表示山洞,其中enter()方法表示一个人进入山洞,leave()方法表示一个人离开山洞。Person类表示一个人,它继承自Thread类,run()方法模拟进出山洞需要的时间。在main()方法中创建5个Person对象并启动它们的线程。
在Cave类的enter()方法中,使用了一个while循环和wait()方法来等待山洞空闲。当山洞被占用时,线程会进入等待状态。当一个线程离开山洞后,它会调用Cave类的leave()方法来释放山洞,同时调用notifyAll()方法通知其他等待线程。
通过使用synchronized关键字来保证线程安全,确保同一时间只有一个线程可以进入山洞。
阅读全文