题目如下:
三个线程a,b,c,每个线程执行{for(int i=0;i!=10;i++) print(‘a’);sleep(random)},每个线程会分别打印出a,b,c这三个字符。3个线程并行执行,请让3个线程按顺序打印出字符
首先写出基础代码如下:
#打印函数
def print_abc( a ):
time.sleep(random.random())
print (a)
#定义线程
def A():
for _ in range(10):
print_abc("a")
def B():
for _ in range(10):
print_abc("b")
def C():
for _ in range(10):
print_abc("c")
#新建线程
try:
_thread.start_new_thread(A,())
_thread.start_new_thread(B,())
_thread.start_new_thread(C,())
except:
print("error")
如果这样写的话,由于sleep的时间是随机的,所以A,B,C的执行顺序也不确定。比如可能输出abbacbba…这种形式但是要求输出abcabcabc…这种形式。
为了控制它们的执行顺序,这里需要用到线程锁。
线程锁
当一个数据有多个线程都可以对其进行修改的时候,任何一个线程改变它都会对其他线程造成影响,如果我们某一个线程在使用完之前,其他线程不能对其修改,就需要对这个线程增加一个线程锁。
#创建锁
mutex = threading.Lock()
#锁定
mutex.acquire([timeout])
#释放
mutex.release()
将线程锁添加到我们的代码中,可得到完整代码如下:
import threading
import time
import random
import _thread
def print_abc( a ):
time.sleep(random.random())
print (a)
def A(lockCA,lockAB):
for _ in range(10):
lockCA.acquire()
print_abc("a")
lockAB.release()
def B(lockAB,lockBC):
for _ in range(10):
lockAB.acquire()
print_abc("b")
lockBC.release()
def C(lockBC,lockCA):
for _ in range(10):
lockBC.acquire()
print_abc("c")
lockCA.release()
try:
lockAB = threading.Lock()
lockBC = threading.Lock()
lockCA = threading.Lock()
lockAB.acquire()
lockBC.acquire()
_thread.start_new_thread(A,(lockCA,lockAB))
_thread.start_new_thread(B,(lockAB,lockBC))
_thread.start_new_thread(C,(lockBC,lockCA))
except:
print("error")
利用锁的添加和释放,就能够很好地控制线程的执行顺序了。
注: 1.在打印的时候,我出现了可执行程序但无法打印的情况,此时可能是由于主线程提前退出。这种情况下,我在try的最后增加了input(),使得走完上面流程后等待键盘输入,最后结束程序。这样主线程就不会退出了,其他程序就可以执行完毕了。
2.该题目我觉得还可以用队列来做,利用先进先出的思想,有时间我会尝试补全。