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

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值