编写程序实现多线程售卖火车票,要求如下: (1)假设售票厅有四个窗口可发售某日某次列车的100张车票。 (2)出售的火车票不能出现重复的票号、大于100的票、小于0的票。 (3)在控制台中打印每个窗口对应售出的票
时间: 2023-11-27 21:51:50 浏览: 143
火车票售票系统 创建多线程
4星 · 用户满意度95%
以下是用 Python 编写的程序实现多线程售卖火车票。程序模拟了一个售票厅,有四个窗口同时售卖某日某次列车的100张车票。每个窗口都是一个独立的线程,通过共享变量来保证售票的正确性。
```python
import threading
tickets = [i for i in range(1, 101)]
lock = threading.Lock()
class TicketSeller(threading.Thread):
def __init__(self, name):
super().__init__(name=name)
def run(self):
while True:
lock.acquire()
if tickets:
ticket = tickets.pop(0)
lock.release()
if ticket > 0 and ticket <= 100:
print(f"{self.name}售出火车票:{ticket}")
else:
print(f"{self.name}售出的票号无效:{ticket}")
else:
lock.release()
break
if __name__ == "__main__":
threads = [TicketSeller(f"窗口{i}") for i in range(1, 5)]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
```
程序中定义了一个 `tickets` 列表,表示所有未售出的火车票号。每个窗口都是一个 `TicketSeller` 类的实例,继承了 Python 的 `threading.Thread` 类,并重写了 `run` 方法,用于执行售票操作。
在 `run` 方法中,线程首先通过 `lock.acquire()` 获取锁,以确保只有一个线程能够访问共享变量 `tickets`。然后从 `tickets` 列表中弹出第一个元素作为要售出的火车票号。如果票号有效(大于0且小于等于100),则在控制台中打印售票信息,否则打印无效票号信息。最后通过 `lock.release()` 释放锁。
在主程序中,创建了四个 `TicketSeller` 实例,并分别启动了这些实例对应的线程。然后通过 `thread.join()` 等待所有线程执行完毕。
阅读全文