python 多线程练习题---四个线程同步打印a b c d

1. 题目描述

有四个线程,每个线程只打印一个字符,这四个字符分别是 a b c d ,现在要求你做到四个线程顺序打印 a b c d ,且每个线程都打印10次

2. 思路分析

假设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 的要求了

3. 示例代码

有了第二步对题目的分析,我决定使用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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案