---恢复内容开始---
通过面向对象的方法实现多线程,其核心是继承threading.Thread类。我们自己定义了一个类BoothThread, 这个类继承自thread.Threading类,通过修改Thread类的run()方法来定义线程所要执行的命令。
1 import threading # Python主要通过标准库中的threading包来实现多线程 2 import time 3 import os 4 5 #作为间隔 每次调用间隔0.5s 6 def doChore(): 7 time.sleep(0.5) 8 9 # 定义一个类BoothThread继承自thread.Threading类 10 class BoothThread(threading.Thread): 11 def __init__(self, tid, monitor): 12 self.tid = tid 13 self.monitor = monitor 14 threading.Thread.__init__(self) 15 def run(self): 16 while True: 17 monitor[‘lock‘].acquire() # 调用lock.acquire() 加锁 18 if monitor[‘tick‘] != 0: 19 monitor[‘tick‘] = monitor[‘tick‘] - 1 # 售票 售出一张减少一张 20 print(self.tid,‘:now left:‘,monitor[‘tick‘]) # 剩下的票数 21 doChore() 22 else: 23 print("Thread_id",self.tid," No more tickets") 24 os._exit(0) # 票售完 退出程序 25 monitor[‘lock‘].release() # 释放锁 26 doChore() 27 28 29 monitor = {‘tick‘:20, ‘lock‘:threading.Lock()} # 初始化票数 30 31 # 总共设置了10个线程 32 for k in range(10): 33 new_thread = BoothThread(k, monitor) # 创建线程; Python使用threading.Thread对象来代表线程 类BoothThread继承自thread.Threading类 34 new_thread.start() # 调用start()方法启动线程
这里使用了一个词典 monitor存放全局变量,然后把词典作为参数传递给线程函数。由于词典是可变数据对象,所以当它被传递给函数的时候,函数所使用的依然是同一个对象,相当于被多个线程所共享。
时间: 2024-10-01 11:05:33