目錄
(一)我一步你一步
(二)我先走,你就不能比我腳先著地(加鎖)
queue.task_done() 在完成一項工作之後,queue.task_done()函式向任務已經完成的佇列傳送乙個訊號
queue.join() 實際上意味著等到隊列為空,再執行別的操作
加了這倆兄弟就能做一碗吃一碗了
import threading
from queue import queue
q = queue()
def producer(name):
count = 1
while count <= 100:
q.join()
q.put(count)
print('{}正在做 第{}碗麵條'.format(name, count))
count += 1
def customer(name):
count = 1
while count <= 100:
data = q.get()
print('{}正在吃第{}碗麵條'.format(name, data))
count += 1
q.task_done()
def main():
t1 = threading.thread(target=producer, args=('海參',))
t2 = threading.thread(target=customer, args=('小包',))
t1.start()
t2.start()
if __name__ == '__main__':
main()
分析:(1)如果producer先搶到cpu,執行到q.join()不用等待可以直接往下執行q.put(count),因為初始隊列為空時或者說接到訊號時join()才可以直接往下執行。執行到put()放入資料,佇列就不為空了,所以xi下一次的迴圈就卡在join()這一行了,等待消費者將資料取出,然後用q.task_done給你發訊號.
(2)如果customer先搶到cpu,執行到q.get()就會等待,因為佇列沒資料,等生產者將資料放入佇列,消費者才會執行
有這麼一種情況:
加鎖之後的**:
import threading
from queue import queue
q = queue()
def producer(name):
count = 1
while count <= 100:
# q = queue(), q.join()也會直接執行下去
q.join()
lock1.acquire()
q.put(count)
print('{}正在做 第{}碗麵條'.format(name, count))
count += 1
lock1.release()
def customer(name):
count = 1
while count <= 100:
data = q.get()
lock1.acquire()
print('{}正在吃第{}碗麵條'.format(name, data))
count += 1
q.task_done()
lock1.release()
def main():
t1 = threading.thread(target=producer, args=('海參',))
t2 = threading.thread(target=customer, args=('小包',))
t1.start()
t2.start()
lock1 = threading.lock()
if __name__ == '__main__':
main()
部分輸出:
生產者與消費者(執行緒同步問題)
主函式 public class productandcustorm 以下是產品類,生產者類,消費者類 產品 class product num p system.out.println 生產者生產了 p 個產品,現有 num 個產品.this.notifyall thread.sleep 200 ...
生成者消費者問題
自己實踐的 生成者消費者問題 public class threaddemo 生產者 class producer implements runnable public void run 消費者 class consumer implements runnable public void run c...
java 執行緒同步問題之生產者消費者問題
public class producerandconsumer catch interruptedexception e flag true 設定生產好標誌為true notifyall 通知消費者消費 public synchronized void take int number catch ...