. 使用多线程技术模拟排队买票: 张先生和李先生买电影票,售票员只有2张5 元的钱.重影票 5 元 20 元的人民市排在李先生的前面买素,市李先生用一张 5 元的人 民 张 张先生用一张 常 买票 请通过编 程模拟排队买票的債形
时间: 2023-12-03 14:43:33 浏览: 31
以下是使用Python多线程技术模拟排队买票的代码示例:
```python
import threading
class TicketSeller:
def __init__(self):
self.money = 0
self.lock = threading.Lock()
def sell_ticket(self, amount):
with self.lock:
if amount <= self.money:
self.money -= amount
return True
else:
return False
def add_money(self, amount):
with self.lock:
self.money += amount
class Customer:
def __init__(self, name, money, ticket_seller):
self.name = name
self.money = money
self.ticket_seller = ticket_seller
def buy_ticket(self):
if self.ticket_seller.sell_ticket(5) == True:
self.money -= 5
self.ticket_seller.add_money(5)
print(self.name + " bought a ticket")
else:
print(self.name + " failed to buy a ticket")
def main():
ticket_seller = TicketSeller()
customers = [
Customer("Li", 30, ticket_seller),
Customer("Zhang", 10, ticket_seller),
Customer("Wang", 20, ticket_seller),
Customer("Zhao", 5, ticket_seller)
]
threads = []
for customer in customers:
thread = threading.Thread(target=customer.buy_ticket)
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
print("Total money: " + str(ticket_seller.money))
if __name__ == '__main__':
main()
```
这个程序中,我们定义了一个`TicketSeller`类,它有一个`money`属性表示售票员手中的钱,以及一个`lock`属性表示线程锁。`sell_ticket`方法用于卖票,如果有足够的钱,就卖出一张票,并返回True;否则返回False。`add_money`方法用于售票员收钱。`Customer`类表示顾客,它有一个`name`属性表示顾客的名字,一个`money`属性表示顾客手中的钱,以及一个`ticket_seller`属性表示售票员。`buy_ticket`方法用于购买电影票,它首先尝试向售票员购买一张价值5元的电影票,如果购买成功,就将自己手中的钱减去5元,并将这5元钱交给售票员。如果购买失败,就打印一条失败的消息。
在`main`函数中,我们创建了一个售票员和4个顾客,然后为每个顾客创建一个线程,启动线程。最后等待所有线程结束后,打印售票员手中剩余的钱。
这样,我们就用Python多线程技术模拟了排队买票的过程。需要注意的是,在并发编程中,需要正确地使用线程锁来保证数据的一致性和线程安全性。