. 使用多线程技术模拟排队买票: 张先生和李先生买电影票,售票员只有2张5 元的钱.重影票 5 元 20 元的人民市排在李先生的前面买素,市李先生用一张 5 元的人 民 张 张先生用一张 常 买票 请通过编 程模拟排队买票
时间: 2024-02-03 21:14:26 浏览: 76
一个多线程模拟购票系统
这里是一个使用Python多线程技术模拟排队买票的示例代码:
```python
import threading
import time
class TicketSeller:
def __init__(self):
self.money = 0
self.money_lock = threading.Lock()
self.ticket_lock = threading.Lock()
def sell_ticket(self, name, money):
print(f"{name}排在了队伍后面")
self.ticket_lock.acquire() # 获取售票锁
print(f"{name}开始买票")
time.sleep(2) # 模拟买票过程
if money == 5:
self.money_lock.acquire() # 获取找零锁
self.money += 5
print(f"{name}购买成功,付款5元,找零0元,售票员手中有{self.money}元")
self.money_lock.release() # 释放找零锁
elif money == 20:
self.money_lock.acquire() # 获取找零锁
if self.money >= 15:
self.money -= 15
print(f"{name}购买成功,付款20元,找零15元,售票员手中有{self.money}元")
else:
print(f"{name}购买失败,付款20元,找零0元,售票员手中有{self.money}元")
self.money_lock.release() # 释放找零锁
self.ticket_lock.release() # 释放售票锁
if __name__ == '__main__':
ticket_seller = TicketSeller() # 初始化售票员
threads = []
threads.append(threading.Thread(target=ticket_seller.sell_ticket, args=("张先生", 5)))
threads.append(threading.Thread(target=ticket_seller.sell_ticket, args=("李先生", 20)))
threads.append(threading.Thread(target=ticket_seller.sell_ticket, args=("小明", 5)))
threads.append(threading.Thread(target=ticket_seller.sell_ticket, args=("小红", 20)))
threads.append(threading.Thread(target=ticket_seller.sell_ticket, args=("小刚", 5)))
threads.append(threading.Thread(target=ticket_seller.sell_ticket, args=("小李", 20)))
for t in threads:
t.start()
for t in threads:
t.join()
```
这段代码中,`TicketSeller`类代表售票员,其中有一个`money`属性表示售票员手中持有的钱数,以及两个锁`money_lock`和`ticket_lock`,分别用于保护售票员的钱数和售票过程。`sell_ticket`方法模拟了一个购票过程,其中通过`ticket_lock`获取售票锁,保证每次只有一个人在排队买票。然后通过`money_lock`获取找零锁,在售票员手中找零,并更新售票员的钱数。最后释放售票锁和找零锁。
在`main`函数中,我们创建了6个线程,代表6个买票者,他们都要排队买票。我们使用`start`方法启动这些线程,并使用`join`方法等待所有线程执行完毕。运行这段代码,可以看到如下输出:
```
张先生排在了队伍后面
李先生排在了队伍后面
小明排在了队伍后面
小红排在了队伍后面
小刚排在了队伍后面
小李排在了队伍后面
张先生开始买票
张先生购买成功,付款5元,找零0元,售票员手中有5元
小明开始买票
小明购买成功,付款5元,找零0元,售票员手中有10元
小红开始买票
小红购买失败,付款20元,找零0元,售票员手中有10元
小刚开始买票
小刚购买成功,付款5元,找零0元,售票员手中有15元
李先生开始买票
李先生购买失败,付款20元,找零0元,售票员手中有15元
小李开始买票
小李购买成功,付款5元,找零0元,售票员手中有20元
```
可以看到,程序正确地模拟了排队买票的过程,并且保证了售票员的钱数正确。
阅读全文