一个类的run()方法有两个方法定义,当使用多线程时,该run()方法中的两个方法执行顺序如何?
为什么每次打印顺序都不一样,actionA和actionB在这种线程中执行顺序是怎么样的?
import threading
import time
class MyThread(threading.Thread):
def actionA(self):
lock.acquire()
print(self.name, 'getA-', time.strftime('%X'))
time.sleep(2)
lock.acquire()
print(self.name, 'getB-', time.strftime('%X'))
time.sleep(1)
lock.release()
lock.release()
def actionB(self):
lock.acquire()
print(self.name, 'getA*', time.strftime('%X'))
time.sleep(2)
lock.acquire()
print(self.name, 'getB*', time.strftime('%X'))
time.sleep(1)
lock.release()
lock.release()
def run(self):
self.actionA()
self.actionB()
if __name__ == '__main__':
lock = threading.RLock()
l = []
for i in range(5):
t = MyThread()
t.start()
l.append(t)
for s in l:
s.join()
print('ending---')
如果你希望在多线程情况下控制线程的执行顺序,你可以使用锁机制,例如 Python 中的 Rlock,来控制线程的执行。
具体实现方式如下:
在线程执行前调用 Rlock 的 acquire 方法,获取锁。
在线程执行完毕后调用 Rlock 的 release 方法,释放锁。
这样就可以保证在多线程情况下,线程的执行顺序按照代码中的顺序进行。
import threading
rlock = threading.RLock()
def actionA():
rlock.acquire()
print("actionA")
rlock.release()
def actionB():
rlock.acquire()
print("actionB")
rlock.release()
# 创建线程
thread1 = threading.Thread(target=actionA)
thread2 = threading.Thread(target=actionB)
# 启动线程
thread1.start()
thread2.start()
这样就可以保证在多线程情况下, actionA 和 actionB 的执行顺序按照代码中的顺序进行。