阿蜜果
不驕,不矜,勤工,好學(xué),才是好女子
你所浪費(fèi)的今天,是昨天死去的人奢望的明天。
你所厭惡的現(xiàn)在,是未來的你回不去的曾經(jīng)。
BlogJava
首頁
新隨筆
新文章
聯(lián)系
聚合
管理
posts - 297, comments - 1618, trackbacks - 0
生產(chǎn)者/消費(fèi)者模型模擬實(shí)現(xiàn)
這是以前為一師妹做的一機(jī)試題,雖后來因?yàn)樗幊痰鬃犹酰瑳]能獲得那份工作,拿在這里與大家共享之。
題目如下:
在生產(chǎn)者/消費(fèi)者模型中,生產(chǎn)者Producer負(fù)責(zé)生產(chǎn)數(shù)據(jù),而消費(fèi)者Consumer負(fù)責(zé)使用數(shù)據(jù)。多個(gè)生產(chǎn)者線程會(huì)在同一時(shí)間運(yùn)行,生產(chǎn)數(shù)據(jù),并放到內(nèi)存中一個(gè)共享的區(qū)域。期間,多個(gè)消費(fèi)者線程讀取內(nèi)存共享區(qū),消費(fèi)里面的數(shù)據(jù)。
要求:
1. 針對上面的場景,請創(chuàng)建2個(gè)類,一個(gè)叫Producer,一個(gè)叫Consumer.
2. Producer類繼承Thread類,并實(shí)現(xiàn)把數(shù)據(jù)放到內(nèi)存共享區(qū)的功能,這個(gè)功能要求是線程安全的。在個(gè)Producer類中的run方法中,循環(huán)20次,每次把一個(gè)整數(shù)放到內(nèi)存共享區(qū)中。
3. Consumer類也繼承Thread類,并實(shí)現(xiàn)在沒有沖突的情況下,從內(nèi)存共享區(qū)中獲取數(shù)據(jù),并在標(biāo)準(zhǔn)輸出設(shè)備中打印輸出。輸出的格式為:Consumer thread X retrieved integer Y.
4. 最后,創(chuàng)建一個(gè)main class,創(chuàng)建10個(gè)Procuder線程和4個(gè)消費(fèi)者線程并啟動(dòng)這些線程。
5. 要求有效代碼行數(shù)盡量少,最好不超過100行。
我大概的做了一下,以下是我的代碼實(shí)現(xiàn):
一. 消費(fèi)者類
/** */
/**
* 消費(fèi)者類
*
@author
Amigo Xie(xiexingxing1121@126.com)
*
*/
class
Consumer
extends
Thread
{
private
Conn conn;
private
int
consumerNumber;
public
Consumer(Conn conn1,
int
conNum)
{
conn
=
conn1;
consumerNumber
=
conNum;
}
public
void
run()
{
for
(
int
i
=
0
; i
<
50
; i
++
)
{
System.out.println(
"
Consumer thread
"
+
consumerNumber
+
"
retrieved integer:
"
+
conn.read());
//
try
{
sleep((
int
) (Math.random()
*
2000
));
}
catch
(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
二. 生產(chǎn)者類
/** */
/**
* 生產(chǎn)者類
*
@author
Amigo Xie(xiexingxing1121@126.com)
*
*/
class
Producer
extends
Thread
{
private
Conn conn;
public
Producer(Conn conn1)
{
conn
=
conn1;
}
public
void
run()
{
for
(
int
i
=
0
; i
<
20
; i
++
)
{
conn.add(i);
}
}
}
三. 線程通信類
/** */
/**
* 線程通信類
*
@author
Amigo Xie(xiexingxing1121@126.com)
*
*/
class
Conn
{
private
int
buffer[]
=
new
int
[
200
];
//
10個(gè)Procuder線程,需存放200個(gè)變量
private
int
next
=
0
;
//
Flags to keep track of our int buffer status
private
boolean
isFull
=
false
;
private
boolean
isEmpty
=
true
;
/** */
/**
* method to read int
*
@return
*/
public
synchronized
int
read()
{
while
(isEmpty
==
true
)
{
//
We can't read if there is nothing in our int buffer
try
{
wait();
//
we'll exit this when isEmpty turns false
}
catch
(InterruptedException e)
{
e.printStackTrace();
}
}
next
--
;
//
decrement the count,since we're going to read one int
if
(next
==
0
)
{
isEmpty
=
true
;
//
Did we read the last letter?
}
isFull
=
false
;
notify();
return
(buffer[next]);
//
return the int to the thread that is reading
}
/** */
/**
* method to add integer to the buffer
*
@param
number
*/
public
synchronized
void
add(
int
number)
{
while
(isFull
==
true
)
{
//
Wait around until there's room to add another letter
try
{
wait();
//
This will exit when isFull turns false
}
catch
(InterruptedException e)
{
e.printStackTrace();
}
}
next
++
;
//
add the integer to the next available spot buffer[next]=number;Change the next available spot
if
(next
==
200
)
{
isFull
=
true
;
//
Are we full?
}
else
{
buffer[next]
=
number;
}
isEmpty
=
false
;
notify();
}
}
四. 測試類
/** */
/**
* 測試類
*
@author
Amigo Xie(xiexingxing1121@126.com)
*
*/
public
class
ProducerAndConsumerTest
{
/** */
/**
*
@param
args
*/
public
static
void
main(String[] args)
{
Conn conn
=
new
Conn();
Producer pro1
=
new
Producer(conn);
Producer pro2
=
new
Producer(conn);
Producer pro3
=
new
Producer(conn);
Producer pro4
=
new
Producer(conn);
Producer pro5
=
new
Producer(conn);
Producer pro6
=
new
Producer(conn);
Producer pro7
=
new
Producer(conn);
Producer pro8
=
new
Producer(conn);
Producer pro9
=
new
Producer(conn);
Producer pro10
=
new
Producer(conn);
Consumer consumer1
=
new
Consumer(conn,
1
);
Consumer consumer2
=
new
Consumer(conn,
2
);
Consumer consumer3
=
new
Consumer(conn,
3
);
Consumer consumer4
=
new
Consumer(conn,
4
);
pro1.start();
pro2.start();
pro3.start();
pro4.start();
pro5.start();
pro6.start();
pro7.start();
pro8.start();
pro9.start();
pro10.start();
consumer1.start();
consumer2.start();
consumer3.start();
consumer4.start();
}
}
近來發(fā)現(xiàn),去看以前的代碼,都覺得有點(diǎn)傻傻滴,現(xiàn)在的話如果去實(shí)現(xiàn)大抵會(huì)有所改進(jìn),我在進(jìn)步中嗎?啊哈。
posted on 2007-04-11 21:52
阿蜜果
閱讀(6292)
評論(8)
編輯
收藏
所屬分類:
Java
FeedBack:
#
re: 生產(chǎn)者/消費(fèi)者模型模擬實(shí)現(xiàn)[未登錄]
2007-04-11 23:01 |
Tony
樓主的測試類可不怎么幽雅,呵呵
回復(fù)
更多評論
#
re: 生產(chǎn)者/消費(fèi)者模型模擬實(shí)現(xiàn)
2007-04-11 23:15 |
阿蜜果
@Tony
啊哈,是極其不優(yōu)雅,以前寫的代碼哩
現(xiàn)在去看從前寫的代碼
有時(shí)真想對它動(dòng)動(dòng)刀子。。。
回復(fù)
更多評論
#
re: 生產(chǎn)者/消費(fèi)者模型模擬實(shí)現(xiàn)
2007-04-12 10:28 |
劉甘泉
哇,測試好多代碼~~~~~~~
回復(fù)
更多評論
#
re: 生產(chǎn)者/消費(fèi)者模型模擬實(shí)現(xiàn)
2007-04-13 09:19 |
riverbuilding
public synchronized void add
public synchronized int read
這兩個(gè)方法造成的結(jié)果是生產(chǎn)者生產(chǎn)時(shí)消費(fèi)者不能同時(shí)消費(fèi),這個(gè)邏輯不多。
回復(fù)
更多評論
#
re: 生產(chǎn)者/消費(fèi)者模型模擬實(shí)現(xiàn)
2007-04-13 13:53 |
hs
樓上說的是,read方法的同步應(yīng)該去掉。
另外發(fā)表一下個(gè)人意見,供大家參考指正:
以上的實(shí)現(xiàn)方法體現(xiàn)不出數(shù)據(jù)共享,或者說共享對象不明確。如果共享對象做成一個(gè)singleton,可能會(huì)好些,更能體現(xiàn)共享的含義。
新建 一個(gè)對象,然后通過傳遞該對象到不同的生產(chǎn)者或消費(fèi)者以達(dá)到共享對象,這種做法欠妥。這種做法導(dǎo)致邏輯不清析,同時(shí)可能會(huì)產(chǎn)生過期引用對象,當(dāng)你認(rèn)為該對象已經(jīng)無用的時(shí)候,可能該對象還被引用著,導(dǎo)致不能回收,你也很難跟宗和控制這個(gè)對象。把共享對象做成singleton,使共享的邏輯清析,也明確該對象永遠(yuǎn)存在。
回復(fù)
更多評論
#
re: 生產(chǎn)者/消費(fèi)者模型模擬實(shí)現(xiàn)[未登錄]
2007-04-13 14:14 |
阿蜜果
@hs
@riverbuilding
:)
感謝你們的建議
這是以前寫的一程序
打算抽空再重寫一次。
回復(fù)
更多評論
#
re: 生產(chǎn)者/消費(fèi)者模型模擬實(shí)現(xiàn)
2007-04-13 16:59 |
att
用 synchronizedList 代替你的那么通信類吧。
回復(fù)
更多評論
#
re: 生產(chǎn)者/消費(fèi)者模型模擬實(shí)現(xiàn)
2010-07-22 19:07 |
Ilovesola
看了你的幾篇文章,覺得還可以,所以多多關(guān)注了一下.
能寫好生產(chǎn)-消費(fèi)者的程序員不多.
代碼我隨便看了一下 和評論也看了一下
有人建議去 read同步方法, 這肯定不能去的,只能說明他們 對生產(chǎn)消費(fèi)模弄理解不夠深.
notify 建議換成 notifyAll();
最后,說明下,不知道你測試過沒,你的程序貌似有個(gè)很嚴(yán)重的邏輯錯(cuò)誤.
就是 應(yīng)該首先add/read 對象,然后再next++ ,next--
我舉個(gè)例子,
你執(zhí)行 main方法 A線程 執(zhí)行add方法 99次,然后B線程去read, 這時(shí)候 next=99,它就 read buffer[99] , 應(yīng)該要read buffer[0]的
回復(fù)
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關(guān)文章:
關(guān)系型數(shù)據(jù)的分布式處理系統(tǒng)MyCAT(1)—概述和基本使用教程
常用加密算法的Java實(shí)現(xiàn)總結(jié)(二)——對稱加密算法DES、3DES和AES
常用加密算法的Java實(shí)現(xiàn)總結(jié)(一)——單向加密算法MD5和SHA
基于注解的Spring MVC+Hibernate簡單入門
新作《Java面試關(guān)鍵與綜合軟件項(xiàng)目開發(fā)全程實(shí)戰(zhàn)》
蜜果私塾:在系統(tǒng)中使用內(nèi)存對象緩存系統(tǒng)(下篇)
蜜果私塾:在系統(tǒng)中使用內(nèi)存對象緩存系統(tǒng)(上篇)
蜜果私塾:數(shù)據(jù)同步給第三方系統(tǒng)的方案探索
蜜果私塾:Java Web系統(tǒng)常用的第三方接口
Java發(fā)HTTP POST請求(內(nèi)容為xml格式)
Copyright ©2025 阿蜜果 Powered by:
博客園
模板提供:
滬江博客
<
2007年4月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來如此。
我的作品:
玩轉(zhuǎn)Axure RP
(2015年12月出版)
Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)
(2015年7月出版)
Struts2+Hibernate3+Spring2
(2010年5月出版)
留言簿
(263)
給我留言
查看公開留言
查看私人留言
隨筆分類
Ajax(3)
Ant(1)
Auto Code(4)
Cewolf
CMMI(1)
CSS(2)
CVS(1)
database(15)
Design Pattern(11)
Eclipse BIRT(1)
EJB
extremecomponents(1)
GIS(2)
Hibernate(8)
iBATIS(2)
IDE(1)
Inno Setup(2)
IT評論(2)
Java(36)
Javascript(32)
JBoss(1)
JFreeChart(3)
JFreeReport(3)
JSF
Linux(3)
MySql(11)
Open Source(4)
Oracle(5)
Other(13)
Spring(12)
Sql Server(1)
Struts(7)
Struts2(8)
Tomcat
UML
Web(8)
Web Service(3)
Workflow
產(chǎn)品原型設(shè)計(jì)(8)
似水流年(13)
協(xié)議(12)
原創(chuàng)小說(1)
技術(shù)評論
架構(gòu)師之路(12)
電信知識(shí)(3)
網(wǎng)絡(luò)通信相關(guān)(11)
職場感悟(6)
解決方案(12)
項(xiàng)目管理(8)
隨筆檔案
2016年3月 (2)
2015年11月 (1)
2015年9月 (1)
2015年6月 (3)
2015年5月 (4)
2014年12月 (2)
2014年7月 (1)
2014年6月 (1)
2014年5月 (2)
2014年1月 (2)
2013年10月 (1)
2013年8月 (1)
2013年7月 (1)
2013年4月 (1)
2013年2月 (1)
2012年11月 (2)
2012年10月 (1)
2012年1月 (1)
2011年11月 (8)
2011年10月 (4)
2011年9月 (1)
2011年8月 (2)
2011年7月 (5)
2011年2月 (2)
2011年1月 (1)
2010年12月 (3)
2010年11月 (9)
2010年9月 (1)
2010年7月 (2)
2010年6月 (2)
2010年5月 (5)
2010年4月 (2)
2009年12月 (4)
2009年11月 (2)
2009年10月 (1)
2009年9月 (3)
2009年8月 (5)
2009年7月 (5)
2009年5月 (1)
2008年10月 (3)
2008年9月 (3)
2008年8月 (1)
2008年6月 (2)
2008年5月 (3)
2008年4月 (2)
2008年2月 (2)
2008年1月 (11)
2007年12月 (9)
2007年11月 (7)
2007年10月 (9)
2007年9月 (12)
2007年8月 (24)
2007年7月 (10)
2007年6月 (2)
2007年5月 (3)
2007年4月 (18)
2007年3月 (24)
2007年2月 (24)
文章分類
喜愛歌詞(12)
生活點(diǎn)滴(3)
芝麻粒知識(shí)(8)
英語(1)
相冊
java學(xué)習(xí)相關(guān)
other
產(chǎn)品經(jīng)理相關(guān)
圖書相關(guān)
工具相關(guān)
日歷
架構(gòu)師相關(guān)
設(shè)計(jì)模式相關(guān)
貼圖
走走拍拍
飯團(tuán)
關(guān)注blog
BeanSoft
JAVA-HE
kenzhang
即興的靈感
壞男孩
孫衛(wèi)琴
施偉
螞蟻
銀河使者
鼠標(biāo)
積分與排名
積分 - 2294512
排名 - 3
最新評論
1.?re: 新書推薦:《Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)》
你好。買了書,麻煩把書中的樣例工程文件發(fā)給我。非常感謝。
我的郵箱:wen027andy@163.com
--文良
2.?re: 新書推薦:《Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)》
@智祿
謝謝指出,下次改版修正:)
--阿蜜果
3.?re: 新書推薦:《Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)》
6.1.3 9.存儲(chǔ)函數(shù)
存儲(chǔ)函數(shù)與存儲(chǔ)函數(shù)類似,……
此處應(yīng)該是:存儲(chǔ)函數(shù)與存儲(chǔ)過程類似,……
我買的是多看上的電子版,請修改
--智祿
4.?re: 新書推薦:《Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)》
您好,今天買了您的這本書,為了更好的學(xué)習(xí),麻煩將書中的樣例工程文件發(fā)給我,萬分感謝,感謝作者寫出這么好的書,我特別需要,祝大賣~~
yaozhilu@foxmail.com
--智祿
5.?re: 新書推薦:《Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)》
您好,書不錯(cuò),已經(jīng)買了,麻煩發(fā)套樣例工程吧,最好詳細(xì)點(diǎn)的,萬分感激!
jackylee365@163.com
--李成龍
閱讀排行榜
1.?常用加密算法的Java實(shí)現(xiàn)總結(jié)(二)——對稱加密算法DES、3DES和AES(143712)
2.?用Ant實(shí)現(xiàn)Java項(xiàng)目的自動(dòng)構(gòu)建和部署(123983)
3.?異常備忘:java.lang.UnsupportedClassVersionError: Bad version number in .class file(114273)
4.?Java代碼規(guī)范、格式化和checkstyle檢查配置文檔(71824)
5.?常用加密算法的Java實(shí)現(xiàn)總結(jié)(一)——單向加密算法MD5和SHA(62383)
6.?通用權(quán)限管理系統(tǒng)設(shè)計(jì)篇(三)——概要設(shè)計(jì)說明書(61740)
7.?使用XFire+Spring構(gòu)建Web Service(一)——helloWorld篇(53663)
8.?基于注解的Spring MVC+Hibernate簡單入門(52589)
9.?在阿里云Linux服務(wù)器上安裝MySQL(49643)
10.?關(guān)系型數(shù)據(jù)的分布式處理系統(tǒng)MyCAT(1)—概述和基本使用教程(47772)
評論排行榜
1.?使用XFire+Spring構(gòu)建Web Service(二)(102)
2.?使用XFire+Spring構(gòu)建Web Service(一)——helloWorld篇(70)
3.?通用權(quán)限管理系統(tǒng)設(shè)計(jì)篇(三)——概要設(shè)計(jì)說明書(64)
4.?異常備忘:java.lang.UnsupportedClassVersionError: Bad version number in .class file(54)
5.?通用權(quán)限管理設(shè)計(jì)篇(二)——數(shù)據(jù)庫設(shè)計(jì)(40)
主站蜘蛛池模板:
日本永久免费a∨在线视频
|
成人影片一区免费观看
|
精品无码人妻一区二区免费蜜桃
|
久久免费公开视频
|
国产免费131美女视频
|
亚洲AV无码第一区二区三区
|
国产精品手机在线亚洲
|
久久精品国产影库免费看
|
在线免费观看一区二区三区
|
亚洲色一色噜一噜噜噜
|
亚洲噜噜噜噜噜影院在线播放
|
人妻无码一区二区三区免费
|
97久久免费视频
|
又粗又黄又猛又爽大片免费
|
亚洲成片观看四虎永久
|
丁香五月亚洲综合深深爱
|
亚洲 欧洲 视频 伦小说
|
a级午夜毛片免费一区二区
|
麻豆国产入口在线观看免费
|
亚洲日本中文字幕
|
污污污视频在线免费观看
|
中文字幕无码不卡免费视频
|
亚洲国产精品无码久久SM
|
久久精品熟女亚洲av麻豆
|
啦啦啦完整版免费视频在线观看
|
日韩免费无码视频一区二区三区
|
国产精品免费网站
|
亚洲熟妇无码乱子AV电影
|
亚洲国产精品嫩草影院
|
亚洲黄色免费在线观看
|
国产亚洲成av片在线观看
|
最新亚洲人成无码网站
|
免费毛片a在线观看67194
|
国产成人精品日本亚洲
|
成人a毛片免费视频观看
|
嫩草影院在线免费观看
|
亚洲精品456在线播放
|
最近2019中文免费字幕在线观看
|
2021免费日韩视频网
|
久久精品国产精品亚洲艾草网
|
精品亚洲成A人无码成A在线观看
|