有四个线程,每个线程只打印一个字符,这四个字符分别是 a b c d ,现在要求你做到四个线程顺序打印 a b c d ,且每个线程都打印10次
假设1 线程只打印a字符,题目要求打印10次,那必然要写一个循环来打印,难点在于,1线程打印一个a之后,不能打印第二个a,因为题目要求的是这四个线程要顺序打印a b c d,这就意味着2 线程接下来要打印b,然后3 线程打印c ,最后4 线程打印d。
这样,第一轮就结束了,接下来,还要打印第二轮。
1线程打印完一个a之后,必须能够通知2线程,并且保证自己不继续打印a,而2线程则必须通知3线程,3线程再通知4号线程,4号线程通知1号线程,周而复始。每个线程在输出前,都必须等待,等待一个通知,通知到了才能打印,不然一股脑的循环打印所有字符,就不能满足四个线程顺序打印a b c d 的要求了
有了第二步对题目的分析,我决定使用Event对这四个线程进行同步,创建4个event对象,分别属于这四个线程,在1号线程里,属于自己的那个event对象调用wait方法进入阻塞状态,同时,也传入2号线程所拥有的event,这样,当1号线程完成打印后,可以用这个event对象去告诉2号线程可以打印了
import threading
a_event = threading.Event()
b_event = threading.Event()
c_event = threading.Event()
d_event = threading.Event()
def print_a(event, next_event):
for i in range(10):
event.wait() # 等待时间触发
print('a')
event.clear() # 内部标识设置为True,下一次循环进入阻塞状态
next_event.set()
def print_b(event, next_event):
for i in range(10):
event.wait()
print('b')
event.clear()
next_event.set()
def print_c(event, next_event):
for i in range(10):
event.wait()
print('c')
event.clear()
next_event.set()
def print_d(event, next_event):
for i in range(10):
event.wait()
print('d')
event.clear()
next_event.set()
a_thread = threading.Thread(target=print_a, args=(a_event, b_event))
b_thread = threading.Thread(target=print_b, args=(b_event, c_event))
c_thread = threading.Thread(target=print_c, args=(c_event, d_event))
d_thread = threading.Thread(target=print_d, args=(d_event, a_event))
a_thread.start()
b_thread.start()
c_thread.start()
d_thread.start()
# 此时,所有的线程都处于阻塞状态
a_event.set()
QQ交流群: 211426309