生產者與消費者問題是多執行緒同步的乙個經典問題。生產者和消費者同時使用一塊緩衝區,生產者生產商品放入緩衝區,消費者從緩衝區中取出商品。我們需要保證的是,當緩衝區滿時,生產者不可生產商品;當緩衝區為空時,消費者不可取出商品。
wait()與notify()方法
lock與condition機制
blockingqueue阻塞佇列
wait()方法使用條件:
wait():一旦執行此方法,當前執行緒就進入阻塞狀態,並釋放同步監視器。
當生產產品數量滿時,呼叫wait()方法,使得生產者釋放鎖,當前執行緒阻塞,消費者執行緒可以獲得鎖。
當產品數量為空時,呼叫wait()方法,使得消費者釋放鎖,當前執行緒阻塞,生產者執行緒可以獲得鎖。
notify()方法使用條件:
notify():一旦執行此方法,就會喚醒被wait的乙個執行緒。如果有多個執行緒被wait,就喚醒優先順序高的那個。
如果剛執行的是消費者,那麼產品數量為0,就執行wait()方法等待。那麼在執行生產者時,只要生產乙個產品就會通過notify()方法喚醒消費者,讓消費者來消費產品。
如果生產者生產產品過快,消費者來不及消費,並且到達產品上限。那麼生產者就執行wait()方法等待。在消費者消費乙個產品就會通過notify()方法喚醒生產者,讓生產者生產產品。
**如下:
//排程類
public
class
clerk
else
catch
(interruptedexception e)}}
//消費產品
public
synchronized
void
consumeproduct()
else
catch
(interruptedexception e)}}
}
//生產者
public
class
producer
extends
thread
@override
public
void
run(
)catch
(interruptedexception e)
clerk.
produceproduct()
;}}}
//消費者
public
class
consumer
extends
thread
@override
public
void
run(
)catch
(interruptedexception e)
clerk.
consumeproduct()
;}}}
//測試類 模擬兩個生產者,兩個消費者
public
class
test
}
執行結果如下: 執行緒經典案例 (生產者和消費者)
假設現在有這樣的乙個情況,生產者生產乙個物品的同時要讓消費者取走。生產者要將自己生產的乙個產品交到乙個公共的區域 超市 讓消費者去取走 購買 所以這個時候我們要考慮到執行緒同步和執行緒重複取值的乙個問題。同步 synchronized,重複取值 設定乙個標記值,當達到條件時執行,未滿足條件時等待 c...
生產者和消費者案例
public final void wait throws interruptedexception 丟擲 illegalmonitorstateexception 如果當前執行緒不是此物件監視器的所有者。interruptedexception 如果在當前執行緒等待通知之前或者正在等待通知時,任何...
生產者 消費者案例(1)
多執行緒開發中經典的案例。生產者 消費者案例 package com.xiaofeng.example 生產者 消費者案例 author xiaofeng1015 public class theaddemo5 class producter implements runnable override...