设计一个多线程程序如下:设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况 1、要求打印出每个售票点所卖出的票号 2、各售票点不能售出相同票号的火车票
时间: 2024-05-02 14:19:48 浏览: 73
可以的,下面是实现该程序的参考代码:
``` python
import threading
class TicketSeller:
def __init__(self, start, end):
self.start = start
self.end = end
self.sold = []
def sell(self):
ticket = self.start
while ticket <= self.end:
if ticket not in self.sold:
self.sold.append(ticket)
print("售票点{}售出火车票{}。".format(threading.current_thread().name, ticket))
ticket += 1
class TrainTicketingSystem:
def __init__(self, total_tickets, num_sellers):
self.total_tickets = total_tickets
self.num_sellers = num_sellers
self.tickets = [i for i in range(1, total_tickets+1)]
self.sellers = []
self.create_sellers()
def create_sellers(self):
seller_tickets = self.total_tickets // self.num_sellers
for i in range(self.num_sellers):
start = i * seller_tickets + 1
end = self.total_tickets if i == self.num_sellers-1 else (i+1) * seller_tickets
seller = TicketSeller(start, end)
self.sellers.append(seller)
def start_selling(self):
threads = [threading.Thread(target=seller.sell) for seller in self.sellers]
for t in threads:
t.start()
for t in threads:
t.join()
if __name__ == '__main__':
t = TrainTicketingSystem(100, 5)
t.start_selling()
```
上述代码中,我们定义了一个 `TicketSeller` 类,它模拟了一个售票点的售票情况。每个售票点都有一个起始票号和终止票号,它会不断循环售票,直到售完为止。在模拟售票时,它先判断当前要售出的票是否已经卖出,如果未卖出,则将票号加入 `sold` 列表,并打印出售出的票号。
接下来,我们定义了一个 `TrainTicketingSystem` 类,它是整个火车售票模拟程序的主体。在初始化时,它会创建指定数量的售票点,并将总票数平均分配给每个售票点。在售票时,我们会启动多个线程来分别执行每个 `TicketSeller` 对象的 `sell` 方法,以便同时模拟多个售票点的售票过程。我们使用 `threading.Thread` 类来创建线程,并在所有线程结束之前等待所有线程结束。
最后,我们在主程序中创建了一个 `TrainTicketingSystem` 对象,并调用其 `start_selling` 方法来开始售票模拟过程。当所有售票点都完成售票后,程序会结束运行,并输出每个售票点所卖出的票号。
阅读全文