這道題要注意的是兩個線程喚醒和等待的順序,應為第一個線程會比第二個線程更早結束,所以如果第一個線程已經結束,而第二個線程還在等待被喚醒,那第二個線程會一直等待下去,因此第一個線程要先等待后喚醒,這樣他會先喚醒第二個線程再結束
- 語無倫次,直接看代碼吧
from threading import Condition, Thread
import timedef printFoo():print('foo', end='')time.sleep(0.5)def printBar():print('bar', end='')time.sleep(0.5)class FooBar:def __init__(self, n):self.n = nself._lock = Condition()def foo(self, printFoo) -> None:self._lock.acquire()for i in range(self.n):printFoo()# 這里要先等待self._lock.wait()self._lock.notify_all()self._lock.release()def bar(self, printBar) -> None:self._lock.acquire()for i in range(self.n):printBar()# 這里要先喚醒其他線程,self._lock.notify_all()self._lock.wait()self._lock.release()if __name__ == '__main__':n = 10foobar = FooBar(n)t1 = Thread(target=foobar.foo, args=(printFoo,))t2 = Thread(target=foobar.bar, args=(printBar,))# t2.start()t1.start()t2.start()
執行用時 :132 ms, 在所有 Python3 提交中擊敗了85.39%的用戶
內存消耗 :16.1 MB, 在所有 Python3 提交中擊敗了100.00%的用戶