启动 3 个线程,每个线程打印一个字母,要求是交替打印 ABC 三个字符。这题主要是考察线程的 wait 和 notify 方法。常见于 Java 的面试题中。今天用 Python 来实现一遍,主要用到了信号量来锁住其他线程。

分析

保证顺序的话要求只能有一个线程在 run,所以需要锁。比如 A 线程要先得到 C 线程和 A 线程的锁才可以打印。打印完成后释放 A 线程的锁,然后 B 线程又满足条件了。

实现

这里主要是采用了信号量,信号量用于在多线程中同步对共享资源的使用。记录了还有多少共享资源可以使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import threading

semaphore_a = threading.Semaphore(1)
semaphore_b = threading.Semaphore(0)
semaphore_c = threading.Semaphore(0)


def show_a():
cnt = 10
while cnt:
semaphore_a.acquire()
print('A')
cnt -= 1
semaphore_b.release()


def show_b():
cnt = 10
while cnt:
semaphore_b.acquire()
print('B')
cnt -= 1
semaphore_c.release()


def show_c():
cnt = 10
while cnt:
semaphore_c.acquire()
print('C')
cnt -= 1
semaphore_a.release()


if __name__ == "__main__":
ta = threading.Thread(target=show_a)
tb = threading.Thread(target=show_b)
tc = threading.Thread(target=show_c)
ts = [ta, tb, tc]
[t.start() for t in ts]
[t.join() for t in ts]

这里初始化为 1 或者 0,作用和锁其实差不多了。