Liver's Java
我不夠貪心!其實我應該明白,心有多貪,舞臺就會有多大!堅持!奮斗!
BlogJava
首頁
新文章
新隨筆
聚合
管理
posts - 4, comments - 6, trackbacks - 0
再談線程:生產者與消費者
昨天提到了線程,那么就不得不提到“
生產者與消費者
”這樣一個經典的
線程同步問題
。
場景描述:
一個倉庫,生產者在工廠里生產了產品后,將產品存放到倉庫里,倉庫存放數量有限,當滿倉后,停止生產,直到有消費著將產品消費后才繼續生產;消費者從倉庫里提取產品,當倉庫空倉時,停止消費產品,直到倉庫中有產品時,才繼續消費產品。
代碼的實現(調整線程sleep時間可以實現生產速度與消費速度的不同):
TestProduceAndConsumer.java
package
com.nantian;
import
java.util.Random;
public
class
TestProduceAndConsumer
{
public
static
void
main(String[] args)
{
//
創建一個工廠對象
ProductFactory pf
=
new
ProductFactory();
//
創建一個生產者和一個消費者,傳遞工廠的引用,保證兩者操作的是同一個工廠
Producer p
=
new
Producer(pf);
Consumer c
=
new
Consumer(pf);
//
啟動兩個線程
p.start();
c.start();
}
}
//
產品工廠
class
ProductFactory
{
//
product表示倉庫
private
char
[] product
=
{
'
'
,
'
'
,
'
'
,
'
'
,
'
'
}
;
//
flag標記產品數量
private
int
flag
=
0
;
//
生產產品
public
synchronized
void
produceProduct(
char
p)
throws
InterruptedException
{
//
判斷產品是否滿倉,以便決定是否繼續生產
if
(flag
==
product.length)
{
this
.wait();
}
//
當代碼執行到這里,一定不是滿倉狀態
product[flag
++
]
=
p;
//
查看此時倉庫狀態(這里不屬于業務邏輯部分)
System.out.print(p
+
"
被生產,當前倉庫狀態:
"
);
for
(
char
tmp : product)
{
System.out.print(tmp);
}
System.out.println();
//
生產方法完成,如果存在等待隊列中的線程,應該喚醒
this
.notifyAll();
}
//
消費產品
public
synchronized
char
consumeProduct()
throws
InterruptedException
{
//
判斷倉庫是否空倉,以便決定是否消費產品
if
(flag
==
0
)
{
this
.wait();
}
//
當代碼執行到這里,一定不是空倉狀態
char
p
=
product[
--
flag]; product[flag]
=
'
'
;
//
查看此時倉庫狀態(這里不屬于業務邏輯部分)
System.out.print(p
+
"
被消費,當前倉庫狀態:
"
);
for
(
char
tmp : product)
{
System.out.print(tmp);
}
System.out.println();
//
消費方法完成,如果存在等待隊列中的線程,應該喚醒
this
.notifyAll();
return
p;
}
}
//
生產者
class
Producer
extends
Thread
{
private
ProductFactory pf
=
null
;
public
Producer(ProductFactory pf)
{
this
.pf
=
pf;
}
public
void
run()
{
//
一共生產20個產品
for
(
int
i
=
0
; i
<
20
; i
++
)
{
//
隨機產生一個大寫字母作為產品
Random r
=
new
Random();
char
p
=
(
char
)(r.nextInt(
26
)
+
'
A
'
);
try
{
//
產品入庫
pf.produceProduct(p);
//
故意sleep,以便消費線程有機會獲得CPU時間片,方便演示
Thread.sleep(
200
);
}
catch
(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
//
消費者
class
Consumer
extends
Thread
{
private
ProductFactory pf
=
null
;
public
Consumer(ProductFactory pf)
{
this
.pf
=
pf;
}
public
void
run()
{
//
一共消費20個產品
for
(
int
i
=
0
; i
<
20
; i
++
)
{
try
{
//
產品出庫
pf.consumeProduct();
//
故意sleep,以便生產線程有機會獲得CPU時間片,方便演示
//
sleep時間稍微錯開,阻止同時競爭CPU時間片
Thread.sleep(
300
);
}
catch
(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
posted on 2009-06-04 10:57
Liver
閱讀(1428)
評論(4)
編輯
收藏
所屬分類:
CoreJava
FeedBack:
#
re: 再談線程:生產者與消費者
2009-06-04 16:22 |
wuzhongxing
利用jdk1.5的concurrent包里面的blockqueue,實現這種模式還是比較簡單的
回復
更多評論
#
re: 再談線程:生產者與消費者
2009-06-04 18:10 |
樂蜂
實現這種模式還是比較簡單的
回復
更多評論
#
re: 再談線程:生產者與消費者[未登錄]
2009-06-06 16:57 |
charlee
// 判斷產品是否滿倉,以便決定是否繼續生產
if (flag == product.length) {
this.wait();
}
// 判斷倉庫是否空倉,以便決定是否消費產品
if(flag == 0) {
this.wait();
}
為什么要用if呢?你不覺得while更好么?
回復
更多評論
#
re: 再談線程:生產者與消費者
2009-06-15 15:53 |
分享愛的空間
言簡意賅,不錯。。。。
希望看到更加深入的。
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
再談線程:生產者與消費者
線程7種狀態的相互轉換
<
2009年6月
>
日
一
二
三
四
五
六
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
6
7
8
9
10
11
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
給我留言
查看公開留言
查看私人留言
隨筆分類
(5)
CoreJava(2)
Oracle
Server(1)
WebService(2)
隨筆檔案
(5)
2010年5月 (1)
2010年4月 (1)
2009年6月 (2)
2009年5月 (1)
搜索
最新評論
1.?re: 線程7種狀態的相互轉換
不錯不錯,分析的好。
--11
2.?re: 線程7種狀態的相互轉換
好!
--yjw
3.?re: 再談線程:生產者與消費者
言簡意賅,不錯。。。。
希望看到更加深入的。
--分享愛的空間
4.?re: 再談線程:生產者與消費者[未登錄]
評論內容較長,點擊標題查看
--charlee
5.?re: 再談線程:生產者與消費者
實現這種模式還是比較簡單的
--樂蜂
閱讀排行榜
1.?Tomcat下配置JNDI數據庫連接池并使用(3280)
2.?線程7種狀態的相互轉換(2191)
3.?再談線程:生產者與消費者(1428)
4.?[轉載]Java遠程通訊技術總結(372)
5.?[轉載]Web Services&XML:什么是Web Service(233)
評論排行榜
1.?再談線程:生產者與消費者(4)
2.?線程7種狀態的相互轉換(2)
3.?Tomcat下配置JNDI數據庫連接池并使用(0)
4.?[轉載]Java遠程通訊技術總結(0)
5.?[轉載]Web Services&XML:什么是Web Service(0)
Copyright ©2025 Liver Powered By
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
亚洲日本国产精华液
|
人人狠狠综合久久亚洲88
|
亚洲人成高清在线播放
|
91香蕉在线观看免费高清
|
亚洲国产综合精品中文第一区
|
成在人线av无码免费高潮喷水
|
亚洲伊人久久综合中文成人网
|
一级毛片a女人刺激视频免费
|
亚洲精品一级无码鲁丝片
|
成a人片亚洲日本久久
|
免费爱爱的视频太爽了
|
午夜亚洲乱码伦小说区69堂
|
四虎影视精品永久免费网站
|
a高清免费毛片久久
|
亚洲国产精品成人精品无码区在线
|
国产精成人品日日拍夜夜免费
|
亚洲电影中文字幕
|
免费观看国产网址你懂的
|
精品久久亚洲中文无码
|
麻豆成人精品国产免费
|
免费一级毛片在线播放视频免费观看永久
|
亚洲va在线va天堂成人
|
四虎成人免费观看在线网址
|
亚洲av成本人无码网站
|
国产亚洲精品激情都市
|
亚洲免费视频播放
|
在线91精品亚洲网站精品成人
|
JLZZJLZZ亚洲乱熟无码
|
4444www免费看
|
亚洲av成人中文无码专区
|
在线观看国产区亚洲一区成人
|
热re99久久6国产精品免费
|
亚洲视频小说图片
|
国产午夜免费福利红片
|
永久免费av无码入口国语片
|
亚洲伊人久久大香线蕉结合
|
亚洲成A人片在线观看无码3D
|
大地资源网高清在线观看免费
|
亚洲人成色在线观看
|
国产亚洲福利精品一区
|
国产成人A在线观看视频免费
|