阿蜜果
不驕,不矜,勤工,好學,才是好女子
你所浪費的今天,是昨天死去的人奢望的明天。
你所厭惡的現在,是未來的你回不去的曾經。
BlogJava
首頁
新隨筆
新文章
聯系
聚合
管理
posts - 297, comments - 1618, trackbacks - 0
生產者/消費者模型模擬實現
這是以前為一師妹做的一機試題,雖后來因為她編程底子太弱,沒能獲得那份工作,拿在這里與大家共享之。
題目如下:
在生產者/消費者模型中,生產者Producer負責生產數據,而消費者Consumer負責使用數據。多個生產者線程會在同一時間運行,生產數據,并放到內存中一個共享的區域。期間,多個消費者線程讀取內存共享區,消費里面的數據。
要求:
1. 針對上面的場景,請創建2個類,一個叫Producer,一個叫Consumer.
2. Producer類繼承Thread類,并實現把數據放到內存共享區的功能,這個功能要求是線程安全的。在個Producer類中的run方法中,循環20次,每次把一個整數放到內存共享區中。
3. Consumer類也繼承Thread類,并實現在沒有沖突的情況下,從內存共享區中獲取數據,并在標準輸出設備中打印輸出。輸出的格式為:Consumer thread X retrieved integer Y.
4. 最后,創建一個main class,創建10個Procuder線程和4個消費者線程并啟動這些線程。
5. 要求有效代碼行數盡量少,最好不超過100行。
我大概的做了一下,以下是我的代碼實現:
一. 消費者類
/** */
/**
* 消費者類
*
@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();
}
}
}
}
二. 生產者類
/** */
/**
* 生產者類
*
@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個Procuder線程,需存放200個變量
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();
}
}
近來發現,去看以前的代碼,都覺得有點傻傻滴,現在的話如果去實現大抵會有所改進,我在進步中嗎?啊哈。
posted on 2007-04-11 21:52
阿蜜果
閱讀(6292)
評論(8)
編輯
收藏
所屬分類:
Java
FeedBack:
#
re: 生產者/消費者模型模擬實現[未登錄]
2007-04-11 23:01 |
Tony
樓主的測試類可不怎么幽雅,呵呵
回復
更多評論
#
re: 生產者/消費者模型模擬實現
2007-04-11 23:15 |
阿蜜果
@Tony
啊哈,是極其不優雅,以前寫的代碼哩
現在去看從前寫的代碼
有時真想對它動動刀子。。。
回復
更多評論
#
re: 生產者/消費者模型模擬實現
2007-04-12 10:28 |
劉甘泉
哇,測試好多代碼~~~~~~~
回復
更多評論
#
re: 生產者/消費者模型模擬實現
2007-04-13 09:19 |
riverbuilding
public synchronized void add
public synchronized int read
這兩個方法造成的結果是生產者生產時消費者不能同時消費,這個邏輯不多。
回復
更多評論
#
re: 生產者/消費者模型模擬實現
2007-04-13 13:53 |
hs
樓上說的是,read方法的同步應該去掉。
另外發表一下個人意見,供大家參考指正:
以上的實現方法體現不出數據共享,或者說共享對象不明確。如果共享對象做成一個singleton,可能會好些,更能體現共享的含義。
新建 一個對象,然后通過傳遞該對象到不同的生產者或消費者以達到共享對象,這種做法欠妥。這種做法導致邏輯不清析,同時可能會產生過期引用對象,當你認為該對象已經無用的時候,可能該對象還被引用著,導致不能回收,你也很難跟宗和控制這個對象。把共享對象做成singleton,使共享的邏輯清析,也明確該對象永遠存在。
回復
更多評論
#
re: 生產者/消費者模型模擬實現[未登錄]
2007-04-13 14:14 |
阿蜜果
@hs
@riverbuilding
:)
感謝你們的建議
這是以前寫的一程序
打算抽空再重寫一次。
回復
更多評論
#
re: 生產者/消費者模型模擬實現
2007-04-13 16:59 |
att
用 synchronizedList 代替你的那么通信類吧。
回復
更多評論
#
re: 生產者/消費者模型模擬實現
2010-07-22 19:07 |
Ilovesola
看了你的幾篇文章,覺得還可以,所以多多關注了一下.
能寫好生產-消費者的程序員不多.
代碼我隨便看了一下 和評論也看了一下
有人建議去 read同步方法, 這肯定不能去的,只能說明他們 對生產消費模弄理解不夠深.
notify 建議換成 notifyAll();
最后,說明下,不知道你測試過沒,你的程序貌似有個很嚴重的邏輯錯誤.
就是 應該首先add/read 對象,然后再next++ ,next--
我舉個例子,
你執行 main方法 A線程 執行add方法 99次,然后B線程去read, 這時候 next=99,它就 read buffer[99] , 應該要read buffer[0]的
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
關系型數據的分布式處理系統MyCAT(1)—概述和基本使用教程
常用加密算法的Java實現總結(二)——對稱加密算法DES、3DES和AES
常用加密算法的Java實現總結(一)——單向加密算法MD5和SHA
基于注解的Spring MVC+Hibernate簡單入門
新作《Java面試關鍵與綜合軟件項目開發全程實戰》
蜜果私塾:在系統中使用內存對象緩存系統(下篇)
蜜果私塾:在系統中使用內存對象緩存系統(上篇)
蜜果私塾:數據同步給第三方系統的方案探索
蜜果私塾:Java Web系統常用的第三方接口
Java發HTTP POST請求(內容為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
生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
我的作品:
玩轉Axure RP
(2015年12月出版)
Power Designer系統分析與建模實戰
(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
產品原型設計(8)
似水流年(13)
協議(12)
原創小說(1)
技術評論
架構師之路(12)
電信知識(3)
網絡通信相關(11)
職場感悟(6)
解決方案(12)
項目管理(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)
生活點滴(3)
芝麻粒知識(8)
英語(1)
相冊
java學習相關
other
產品經理相關
圖書相關
工具相關
日歷
架構師相關
設計模式相關
貼圖
走走拍拍
飯團
關注blog
BeanSoft
JAVA-HE
kenzhang
即興的靈感
壞男孩
孫衛琴
施偉
螞蟻
銀河使者
鼠標
積分與排名
積分 - 2294288
排名 - 3
最新評論
1.?re: 新書推薦:《Power Designer系統分析與建模實戰》
你好。買了書,麻煩把書中的樣例工程文件發給我。非常感謝。
我的郵箱:wen027andy@163.com
--文良
2.?re: 新書推薦:《Power Designer系統分析與建模實戰》
@智祿
謝謝指出,下次改版修正:)
--阿蜜果
3.?re: 新書推薦:《Power Designer系統分析與建模實戰》
6.1.3 9.存儲函數
存儲函數與存儲函數類似,……
此處應該是:存儲函數與存儲過程類似,……
我買的是多看上的電子版,請修改
--智祿
4.?re: 新書推薦:《Power Designer系統分析與建模實戰》
您好,今天買了您的這本書,為了更好的學習,麻煩將書中的樣例工程文件發給我,萬分感謝,感謝作者寫出這么好的書,我特別需要,祝大賣~~
yaozhilu@foxmail.com
--智祿
5.?re: 新書推薦:《Power Designer系統分析與建模實戰》
您好,書不錯,已經買了,麻煩發套樣例工程吧,最好詳細點的,萬分感激!
jackylee365@163.com
--李成龍
閱讀排行榜
1.?常用加密算法的Java實現總結(二)——對稱加密算法DES、3DES和AES(143710)
2.?用Ant實現Java項目的自動構建和部署(123980)
3.?異常備忘:java.lang.UnsupportedClassVersionError: Bad version number in .class file(114271)
4.?Java代碼規范、格式化和checkstyle檢查配置文檔(71822)
5.?常用加密算法的Java實現總結(一)——單向加密算法MD5和SHA(62382)
6.?通用權限管理系統設計篇(三)——概要設計說明書(61737)
7.?使用XFire+Spring構建Web Service(一)——helloWorld篇(53661)
8.?基于注解的Spring MVC+Hibernate簡單入門(52588)
9.?在阿里云Linux服務器上安裝MySQL(49641)
10.?關系型數據的分布式處理系統MyCAT(1)—概述和基本使用教程(47770)
評論排行榜
1.?使用XFire+Spring構建Web Service(二)(102)
2.?使用XFire+Spring構建Web Service(一)——helloWorld篇(70)
3.?通用權限管理系統設計篇(三)——概要設計說明書(64)
4.?異常備忘:java.lang.UnsupportedClassVersionError: Bad version number in .class file(54)
5.?通用權限管理設計篇(二)——數據庫設計(40)
主站蜘蛛池模板:
国产伦精品一区二区三区免费迷
|
6080午夜一级毛片免费看
|
久久99国产乱子伦精品免费
|
久久激情亚洲精品无码?V
|
免费无遮挡无码视频在线观看
|
日韩成人免费aa在线看
|
亚洲精品人成网线在线播放va
|
拨牐拨牐x8免费
|
中文有码亚洲制服av片
|
成年性午夜免费视频网站不卡
|
男女交性无遮挡免费视频
|
亚洲黑人嫩小videos
|
最近高清中文字幕无吗免费看
|
99999久久久久久亚洲
|
在线观着免费观看国产黄
|
国色精品va在线观看免费视频
|
亚洲精品无AMM毛片
|
国产成人精品日本亚洲专区61
|
全部免费a级毛片
|
国产VA免费精品高清在线
|
国内精品久久久久久久亚洲
|
青娱乐免费视频在线观看
|
亚洲欧美日韩久久精品
|
免费一级国产生活片
|
13一14周岁毛片免费
|
一级毛片a免费播放王色
|
久久久久久a亚洲欧洲AV
|
久草视频在线免费
|
亚洲第一成年免费网站
|
亚洲国产精品久久
|
女人18特级一级毛片免费视频
|
特级毛片aaaa级毛片免费
|
亚洲乱码中文字幕久久孕妇黑人
|
一级人做人a爰免费视频
|
亚洲中文字幕乱码AV波多JI
|
夜色阁亚洲一区二区三区
|
国产精品免费看久久久
|
亚洲一区二区三区成人网站
|
亚洲资源在线视频
|
亚洲不卡中文字幕无码
|
日本黄色免费观看
|