某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票. 请设计一个程序模拟该电影院卖票,并保证线程同步,不会出现错误的买票数据。 通过继承Thread类的方式创建线程类,然后实现三个窗口麦票的功能
时间: 2024-04-09 12:27:52 浏览: 76
售票窗口模拟线程同步
以下是使用继承Thread类的方式创建线程类,实现三个窗口卖票功能的示例程序:
```python
import threading
class Ticket(threading.Thread):
total_tickets = 100
lock = threading.Lock()
def __init__(self, window):
threading.Thread.__init__(self)
self.window = window
def run(self):
while True:
Ticket.lock.acquire()
if Ticket.total_tickets > 0:
print(f"售票窗口{self.window}卖出一张票,剩余{Ticket.total_tickets-1}张票")
Ticket.total_tickets -= 1
else:
print("票已售完")
break
Ticket.lock.release()
if __name__ == "__main__":
threads = []
for i in range(3):
thread = Ticket(i+1)
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
```
在这个例子中,我们创建了一个继承自Thread类的Ticket类来表示售票窗口。Ticket类有一个类属性`total_tickets`表示剩余票数,以及一个类属性`lock`用于线程同步。
在Ticket类的run()方法中,使用`Ticket.lock.acquire()`获取锁,确保在同一时刻只有一个线程能执行卖票操作。然后根据剩余票数进行售票或者显示票已售完的信息。当票已售完时,使用`break`退出循环,结束线程。
在主程序中,我们创建了3个Ticket对象表示3个售票窗口,然后分别启动这3个线程。最后使用`join()`方法等待所有线程执行完毕。
通过使用继承Thread类的方式,每个线程对象都具有自己的窗口编号,可以独立执行售票操作,确保线程同步,避免了错误的买票数据。
阅读全文