執行緒的學習(3) 生產者消費者

2021-10-01 03:14:25 字數 1611 閱讀 5009

需要乙個資料num,以便生產者和消費者都能訪問;需要乙個鎖物件lock;需要設定乙個表示「是否還有資料」的標誌:isnumempty。

生產者: 生產者在生產資料前,應該先查詢還有沒有資料。

若isnumempty為true

1、生產資料

2、喚醒在lock物件上阻塞的消費者

若isnumempty為false

1、消費資料

2、喚醒在lock物件上阻塞的消費者

首先給出乙個介面:icommonobject,由此派生出消費者和生產者,這樣lock和num和isnumempty就可以被生產者和消費者都共享了。

public inte***ce icommonobject

default boolean isnumempty()

default int getnum()

}

給乙個producer類

public class producer implements runnable

/***開始建立生產者執行緒

*/public void start()

@override

public void run()

catch(interruptedexception e)

}commonobject.setnum(i);

system.out.println("生產者(" + thread.getname() + ")生產了乙個資料:" + i);

icommonobject.lock.notify();}}

}class innerproducer implements icommonobject}}

給乙個consumer類:

public class consumer implements runnable

public void start()

@override

public void run()

catch(interruptedexception e)

}int num=commonobject.getnum();

system.out.println("消費者消費了" + num);

icommonobject.lock.notify();}}

}class innerconsumer implements icommonobject}}

給出乙個測試類:

public class test

}

執行結果

但是,上面的**對於 「多生產者」 或者 「多消費者」的 情況下,這個**就可能會出現問題了,因為可能乙個「生產者」喚醒了另乙個「生產者」,導致另乙個「生產者」使鎖執行wait(),接著就會出現「死鎖」現象。

所以我們要用notifyall(),而不是notify()。

這樣的話,喚醒的是所有處於這個鎖的阻塞佇列的執行緒,就不會出現「死鎖」現象了。

執行緒(六) 生產者消費者模式

為什麼要使用生產者消費者模式 什麼是生產者消費者模式 生產者消費模式是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費這彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞佇列就相當於乙個緩衝區,...

python3 生產者消費者

code from queue import queue from threading import thread 用來表示終止的特殊物件 sentinel object a thread that produces data def producer out q for i in range 10...

5 12 生產者和消費者

一 生產者和消費者之間的關係 1 生產者將生產出來的資訊不斷存入乙個區域內,消費者將資訊從該區域內不斷讀取出來 生產者錄入資訊 消費者讀取資訊 例 電影票 public class movie public void setname string name public string getinfo...