生產者/消費者模式要求在同乙個程序位址空間內執行的兩個執行緒。
生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。
消費者執行緒從緩衝區中獲得物品,然後釋放緩衝區。
當生產者執行緒生產物品時,如果沒有空緩衝區可用,那麼生產者執行緒必須等待消費者執行緒釋放出乙個空緩衝區。
當消費者執行緒消費物品時,如果沒有滿的緩衝區,那麼消費者執行緒將被阻塞,直到新的物品被生產出來。
優點:
(1)解耦。假設生產者和消費者分別是兩個類。如果讓生產者直接呼叫消費者的某個方法,那麼生產者對於消費者就會產生依賴(也就是耦合)。將來如果消費者的**發生變化,可能會影響到生產者。而如果兩者都依賴於某個緩衝區,兩者之間不直接依賴,耦合也就相應降低了。
(2)支援併發。生產者直接呼叫消費者的某個方法,還有另乙個弊端。由於函式呼叫是同步的(或者叫阻塞的),在消費者的方法沒有返回之前,生產者只好一直等在那邊。萬一消費者處理資料很慢,生產者就會浪費時間。
(3)支援忙閒不均。緩衝區還有另乙個好處。如果製造資料的速度時快時慢,緩衝區的好處就體現出來了。當資料製造快的時候,消費者來不及處理,未處理的資料可以暫時存在緩衝區中。等生產者的製造速度慢下來,消費者再慢慢處理掉。
public
class producerconsumer
}
public
class
consumer
extends
thread
public
void
run()
try catch (interruptedexception e)
}// while
}// run
}
public
class
producer
extends
thread
public
void
run()
try catch (interruptedexception e)
}// while
}// run
}
public
class
box
/*** 獲取緩衝區的乙個元素
* *@return
*/public
synchronized
intget()
while (realnum == 0) catch (interruptedexception e)
}// while
if (realnum > 0)
// 遍歷輸出快取區所有元素
system.out.print("取出後緩衝區剩下元素: ");
for (int i = 0; i < realnum; i++)
system.out.println();
return getvalue;
}// get
/** * 向緩衝區插入乙個元素
* *@param value
*/public
synchronized
void
put(int value)
while (realnum == maxcap) catch (interruptedexception e)
}if (realnum < maxcap)
// 遍歷輸出快取區所有元素
system.out.print("插入後緩衝區有元素: ");
for (int i = 0; i < realnum; i++)
system.out.println();}}
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
java生產者消費者
題目 請用多執行緒實現乙個生產者類和乙個消費者類,生產者隨機生成20個字元,消費者將字元列印到控制台。class syncstackcatch interruptedexception e this.notify 通知其它執行緒把資料出棧 buffer index c 資料入棧 index 指標向上...
生產者 消費者模式
一 我哥們把資料存入redis快取區 生產者 二 我從緩衝器取資料,並作處理!消費者 詳細 如下 取訂單並判斷 redis new redis conn flag redis connect redis translate usefull host,redis translate usefull p...