lock版本的生產者與消費者模式可以正常的進行。但是存在一乙個不足,在消費者中,總是通過while true 死迴圈並且上鎖的方式去判斷錢夠不夠,上鎖是一種很耗費cpu的行為,.因此這種方式不是最好的.還有一種更好的方式便是使
用threading.condition 來實現。· threading.conditton 可以在沒有資料的吋候處於阻塞等待狀態。一旦有合適的資料了,還可以使用notity相關的函式來通知其他處於等待狀態的執行緒。這樣就可以不用做一些無用的上鎖和解鎖的操作,可以提高程式的效能。
首先対tmrecing.condition相美的注動霰個か紹,threading.condition類似於threading.lock ,可以在修改全域性資料的吋候進行上鎖,也可以在修改完畢後進行解鎖。以下將一-些常用的函式進行筒単的介紹:
1. acquire:上鎖。
2. release :解鎖。
3. wait :將當前執行緒處於等待狀態,並且會釋放鎖。可以接其他執行緒使用notify和notify_all函式喚醒,被喚醒後會繼續等待上鎖,上鎖後會繼續執行 下面的**
4. notify : 通知某個正在等待的執行緒,預設是第乙個等待的執行緒。
5. notify_all :通知所有正在等待的執行緒。
注意:notify和notify_all不會釋放鎖,並且需要在release之前使用。
示例**如下:
#encoding: utf-8condition版的生戸者與消費者模式:import threading
import random
import
time
gmoney = 1000
gcondition = threading.condition()
gtotaltimes = 10
gtimes = 0
class producer(threading.thread):
def run(self):
global gmoney
global gtimes
while true:
money = random.randint(100,1000)
gcondition.acquire()
if gtimes > 10:
gcondition.release()
break
gmoney += money
print('%s
生產了%d
元錢,剩餘
%d元錢
'%(threading.current_thread(),money,gmoney))
gtimes += 1
gcondition.notify_all()
gcondition.release()
time.sleep(0.5)
class consumer(threading.thread):
def run(self):
global gmoney
while true:
money = random.randint(100,1000)
gcondition.acquire()
while gmoney < money:
if gtimes >=gtotaltimes:
gcondition.release()
return
print('%s
準備消費
%d元錢,剩餘
%d元錢,餘額不足
!' %(threading.current_thread(),money,gmoney))
gcondition.wait()
gmoney -= money
print('%s
消費了%d
元錢,剩餘
%d元錢
' % (threading.current_thread(),money,gmoney),)
gcondition.release()
time.sleep(0.5)
def main():
for x in
range(3):
t = consumer(name='
消費者執行緒
%d'%x)
t.start()
for x in
range(5):
t = producer(name='
生產者執行緒
%d'%x)
t.start()
if __name__ == '__main__':
main()
tock版本的生戸者與淆酉者襖式可以正常的遙行。但是存在一乙個不足,在消穂者中,怠是通せwtle true 死循粁井且上輌的方式去刔斷軼不躬·上靤崖乙個很耗薺cpu斉源的行カ.因此泣狆方式不是最好的.迂有一狆更好的方式便是使
用threoing.cendition 來女親· threaing.conditton 可以在沒有資料的吋候阯於阻墓等待狀志。一旦有含遁的數握了,逐可以使用notity相美的鑼戱來通丸其他処於等恃侍狀志的も程。迄拝孰可い不用飮一些無用的上鈍和解御的操作。可以摧高程式的效能。首先対tmrecing.condition相美的注動霰個か紹,tnresding.coneito 霙儀threding.cock ,可以在修改全域性數掘的吋候迸行、上蜻,也可以在慘改亢柴後迸行解情。以下將一-些常用的匠針徹個筒単的介紹:1 acqutre s上饋。2 release t解鎖。
a. wait持當荊扶程妣於等待狀傑, 並且會釋旅餉。可ソ樓其他扶程使用notify和notify_oll 伺徴喚酲·被嚀醒後會紲燒等待上領,上輌後継與拉行下薗的代烏。
4 notify :知某↑正在等待的扶橿.默以是篳i↑等待的桟程。
s notify_o t通知所有正在等待的注程· netify 和notify_o1l 不會釋欣飮。並且需愛在retiease之前墹用·condition嶺的生戸看與消轡者模式代咼加下:
Java多執行緒應用 condition的使用
它沒有明確指定喚醒那條執行緒。下面是乙個例項 同起三條執行緒,分別執行private aaa a new aaa 物件的三個方法,讓三個方法按指定的順序列印輸入,先是ooo方法迴圈3次,接著nnn方法迴圈5次,接著mmm方法迴圈7次,這樣依次執行迴圈10次 classname conditionte...
Java多執行緒學習 Condition的使用
condition將object監視器方法 wait notify和notifyall 分解成截然不同的物件,以便通過將這些物件與任意lock實現組合使用,為每個物件提供多個等待 set wait set 其中,lock替代了synchronized方法和語句的使用,condition替代了 obj...
Lock和Condition實現多執行緒迴圈執行
我們可能有如下使用場景 a b c三個執行緒,業務需要a執行5遍,然後b執行10遍,然後c執行15遍,如此迴圈 這時候我們可以考慮用到lock的condition機制 public class locktest for int i 0 i 5 i number 2 c2.signal lock.un...