一、为什么需要终止线程
在线程编程中,有时候需要终止线程的执行。这可能是由于程序需要在某个时间点停止某个线程的执行,或者线程执行遇到错误需要被终止,或者在用户请求终止线程时需要将线程停止。无论是哪种情况,这都需要我们知道如何正确地终止线程。
二、使用stop()方式终止线程
在Python中,可以通过stop()方法来终止线程的执行,但是这种方式并不安全,因为stop()方法只是简单地终止线程的执行,会导致线程所持有的锁无法被释放,从而导致程序发生死锁。因此,我们通常不建议使用stop()方法来终止线程。
三、使用标志位终止线程
使用标志位来终止线程是一种更安全更有效的终止线程方式。一般情况下,我们为线程添加一个布尔型的标志位,判断标志位是否为真,来控制线程的执行。当标志位为假时,线程会停止执行。
import threading import time class myThread(threading.Thread): def __init__(self, threadID, name, flag): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.flag = flag def run(self): while self.flag: print("Thread " + self.name + " is running...") time.sleep(1) print("Thread " + self.name + " stopped.") def stop(self): self.flag = False t1 = myThread(1, "Thread 1", True) t2 = myThread(2, "Thread 2", True) t1.start() t2.start() time.sleep(5) t1.stop() t2.stop() t1.join() t2.join()
四、使用Thread类的事件对象终止线程
在Python的Thread类中,有一个事件对象,使用该事件对象可以控制线程的执行。当事件对象被设置为True时,线程会继续执行,当事件对象被设置为False时,线程会停止执行。
import threading import time class myThread(threading.Thread): def __init__(self, threadID, name, event): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.event = event def run(self): while self.event.is_set(): print("Thread " + self.name + " is running...") time.sleep(1) print("Thread " + self.name + " stopped.") def stop(self): self.event.clear() t1_event = threading.Event() t1 = myThread(1, "Thread 1", t1_event) t2_event = threading.Event() t2 = myThread(2, "Thread 2", t2_event) t1_event.set() t2_event.set() t1.start() t2.start() time.sleep(5) t1.stop() t2.stop() t1.join() t2.join()
五、使用Thread类的terminate()方法终止线程
在Python3的Thread类中,有一个terminate()方法可以用来终止线程的执行。该方法会引发一个SystemExit异常,从而安全地退出线程。
import threading import time class myThread(threading.Thread): def __init__(self, threadID, name): threading.Thread.__init__(self) self.threadID = threadID self.name = name def run(self): while True: print("Thread " + self.name + " is running...") time.sleep(1) def stop(self): pass t1 = myThread(1, "Thread 1") t2 = myThread(2, "Thread 2") t1.start() t2.start() time.sleep(5) t1.terminate() t2.terminate() t1.join() t2.join()