当使用Thread
类创建线程时,可以通过继承Thread
类来创建自定义的线程类,并重写其中的方法。下面是一个形象的例子,用来模拟电影院售票系统的并发处理。
from threading import Thread, Lock
# 全局变量,表示电影票数量
ticket_count = 100
# 创建锁对象,用于线程同步
lock = Lock()
class TicketSeller(Thread):
"""
售票员线程类
"""
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
global ticket_count
while True:
# 获取锁
lock.acquire()
if ticket_count > 0:
# 模拟售票过程
ticket_count -= 1
print(f"{self.name}售出1张票,剩余票数: {ticket_count}")
else:
print("票已售罄,停止售票!")
# 释放锁
lock.release()
break
# 释放锁
lock.release()
def main():
# 创建售票员线程对象
seller1 = TicketSeller("售票员1")
seller2 = TicketSeller("售票员2")
# 启动售票员线程
seller1.start()
seller2.start()
# 等待售票员线程执行完毕
seller1.join()
seller2.join()
print("所有售票员线程执行完毕")
if __name__ == '__main__':
main()
在上述代码中,我们模拟了一个电影院售票系统。首先,定义了一个全局变量ticket_count
,表示电影票的数量,初始为100。
然后,创建了一个Lock
对象lock
,用于线程同步。
接下来,定义了一个TicketSeller
类,继承自Thread
类,**并重写run方法,你可以在自定义的线程类中定义线程的执行逻辑。然后,通过调用start方法,实际上是在启动一个新线程,并在新线程中执行你所定义的run方法。**在run
方法中,通过acquire
方法获取锁,然后判断电影票的数量是否大于0。如果大于0,则模拟售票过程,将电影票数量减1,并打印出售票信息。否则,打印出票已售罄的信息,释放锁并结束线程。
在main
函数中,创建了两个TicketSeller
对象,分别代表两个售票员。然后,通过调用start
方法启动售票员线程。售票员线程开始执行各自的run
方法,并在执行过程中进行售票和打印。
最后,使用join
方法等待售票员线程执行完成,确保主线程等待所有售票员线程执行完毕后再继续执行。最后打印出所有售票员线程执行完毕的提示。
通过继承Thread
类并重写其中的方法,我们可以自定义线程类,并根据具体需求编写线程的执行逻辑。这样可以实现电影院售票系统的并发处理,
确保线程安全和数据一致性。