生產者 消費者模式 java

2021-07-10 21:39:19 字數 1959 閱讀 3675

生產者/消費者模式要求在同乙個程序位址空間內執行的兩個執行緒。

生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。

消費者執行緒從緩衝區中獲得物品,然後釋放緩衝區。

當生產者執行緒生產物品時,如果沒有空緩衝區可用,那麼生產者執行緒必須等待消費者執行緒釋放出乙個空緩衝區。

當消費者執行緒消費物品時,如果沒有滿的緩衝區,那麼消費者執行緒將被阻塞,直到新的物品被生產出來。

優點:

(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...