使用多线程,过山洞问题:请按要求编写多线程应用程序,模拟多个人通过一个山洞: 1、这个山洞每次只能通过一个人,每个人通过山洞的时间为2秒; 2、随机生成10个人,同时准备过此山洞,并且定义一个变量用于记录通过人的信息
时间: 2023-11-09 19:04:15 浏览: 122
下面是使用 Python 实现的多线程过山洞问题的代码:
```python
import threading
import time
import random
class Person(threading.Thread):
def __init__(self, name, cave):
super().__init__()
self.name = name
self.cave = cave
def run(self):
self.cave.enter(self.name)
time.sleep(2)
self.cave.leave(self.name)
class Cave:
def __init__(self):
self.lock = threading.Lock()
self.passed = []
def enter(self, name):
self.lock.acquire()
print(f"{name} is entering the cave.")
self.passed.append(name)
self.lock.release()
def leave(self, name):
self.lock.acquire()
print(f"{name} is leaving the cave.")
self.lock.release()
def main():
cave = Cave()
people = [Person(f"Person{i}", cave) for i in range(10)]
random.shuffle(people)
for person in people:
person.start()
time.sleep(1)
if __name__ == "__main__":
main()
```
在这个程序中,我们定义了一个 `Person` 类和一个 `Cave` 类。`Person` 类继承自 `threading.Thread` 类,用于模拟一个人通过山洞的过程。`Cave` 类用于记录通过山洞的人的信息。
在 `Person` 类的 `run()` 方法中,我们调用 `Cave` 类的 `enter()` 方法记录进入山洞的人的信息,并且让线程休眠 2 秒,模拟通过山洞的过程。然后再调用 `Cave` 类的 `leave()` 方法记录离开山洞的人的信息。
在 `Cave` 类中,我们使用了一个 `lock` 变量来保证多个人同时访问 `passed` 列表时不会出现问题。`passed` 列表用于记录通过山洞的人的姓名。
在 `main()` 函数中,我们创建了一个 `Cave` 实例和 10 个 `Person` 实例,随机打乱了人的顺序。然后我们依次启动每个人的线程,并且让线程休眠 1 秒,模拟人们准备通过山洞的过程。
阅读全文