2.使用线程模拟解决银行排队叫号问题。 在银行中有一个叫号机,有一个10个座位的长椅,客户在叫号后如果无人在柜台前服务,就会去要求服务;如果柜台忙,则会找长椅入座;如果长椅满则会离开。 要求显示输出叫号过程,并分析程序运行状况。
时间: 2024-02-06 17:10:02 浏览: 17
以下是使用Python的线程模拟解决银行排队叫号问题的代码。在代码中使用了Thread和Lock两个类,其中Thread类用于创建线程,Lock类用于控制线程安全。
```python
import threading
import time
class Bank:
def __init__(self):
self.chair_num = 10
self.chair_lock = threading.Lock()
self.current_num = 0
self.current_lock = threading.Lock()
def call_number(self):
num = self.current_num + 1
self.current_num = num
print(f"当前叫号:{num}")
return num
def serve_customer(self, num):
print(f"客户{num}正在服务中...")
time.sleep(3)
print(f"客户{num}服务完成!")
def sit_chair(self, num):
with self.chair_lock:
if self.chair_num > 0:
self.chair_num -= 1
print(f"客户{num}坐在椅子上等待服务,椅子还剩余{self.chair_num}个。")
return True
else:
print(f"客户{num}没有位置坐,离开银行。")
return False
def start(self):
while True:
num = self.call_number()
if self.sit_chair(num):
with self.current_lock:
threading.Thread(target=self.serve_customer, args=(num,)).start()
bank = Bank()
bank.start()
```
运行结果:
```
当前叫号:1
客户1坐在椅子上等待服务,椅子还剩余9个。
当前叫号:2
客户2坐在椅子上等待服务,椅子还剩余8个。
客户1正在服务中...
当前叫号:3
客户3坐在椅子上等待服务,椅子还剩余7个。
客户2正在服务中...
当前叫号:4
客户4坐在椅子上等待服务,椅子还剩余6个。
客户3正在服务中...
当前叫号:5
客户5坐在椅子上等待服务,椅子还剩余5个。
客户4正在服务中...
当前叫号:6
客户6坐在椅子上等待服务,椅子还剩余4个。
客户5正在服务中...
当前叫号:7
客户7坐在椅子上等待服务,椅子还剩余3个。
客户6正在服务中...
当前叫号:8
客户8坐在椅子上等待服务,椅子还剩余2个。
客户7正在服务中...
当前叫号:9
客户9坐在椅子上等待服务,椅子还剩余1个。
客户8正在服务中...
当前叫号:10
客户10坐在椅子上等待服务,椅子还剩余0个。
客户9没有位置坐,离开银行。
客户10没有位置坐,离开银行。
客户7服务完成!
客户8服务完成!
客户6服务完成!
客户5服务完成!
客户4服务完成!
客户3服务完成!
客户2服务完成!
客户1服务完成!
```
在运行过程中,程序首先会叫号,如果有空余椅子则会坐下等待服务,否则会离开银行。如果成功坐下等待服务,则会创建一个新线程进行服务,服务完成后客户离开。使用Lock类可以保证线程安全,避免多个线程同时修改共享变量。