Cyh的博客
Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220
導航
BlogJava
首頁
新隨筆
聯系
聚合
管理
公告
一直努力努力努力,像奴隸奴隸奴隸!~~
<
2025年5月
>
日
一
二
三
四
五
六
27
28
29
30
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
31
1
2
3
4
5
6
7
常用鏈接
我的隨筆
我的文章
我的評論
我的參與
最新評論
隨筆檔案
(25)
2011年5月 (1)
2010年4月 (12)
2010年1月 (1)
2009年12月 (2)
2009年6月 (1)
2009年4月 (4)
2009年2月 (4)
文章分類
(219)
Android(26)
DB(5)
J2EE(31)
J2SE(79)
JavaScript(15)
others(47)
SOA&Web Service(1)
中間件(1)
軟件工程(12)
軟件架構(2)
文章檔案
(220)
2011年8月 (1)
2010年12月 (23)
2010年11月 (2)
2010年8月 (5)
2010年7月 (2)
2010年6月 (2)
2010年5月 (1)
2010年4月 (12)
2010年3月 (28)
2010年2月 (5)
2010年1月 (23)
2009年12月 (39)
2009年6月 (14)
2009年5月 (31)
2009年3月 (2)
2009年2月 (29)
2009年1月 (1)
新聞檔案
(66)
2010年10月 (1)
2010年9月 (5)
2010年8月 (11)
2010年7月 (21)
2010年6月 (13)
2010年5月 (8)
2010年4月 (5)
2009年11月 (2)
相冊
Ryan
收藏夾
(7)
JAVA(7)
最新隨筆
1.?集成FCKeditor 3.5.3
2.?android自適應屏幕方向和大小
3.?Android游戲開發之旅(二十) 雙按事件捕獲
4.?Android游戲開發之旅(十八) SoundPool類
5.?Android游戲開發之旅(十九) 分辨率大全
6.?Android游戲開發之旅(十七) 圖像漸變特效
7.?Android游戲開發之旅(十六) 異步音樂播放
8.? Android游戲開發之旅(十四) 游戲開發實戰一
9.?Android游戲開發之旅(十五) 按鍵中斷處理
10.?Android游戲開發之旅(十二)Sensor重力感應(2)
搜索
最新評論
1.?re: struts2 checkboxlist標簽的使用
同居同意同意
--yuk
2.?re: struts2 checkboxlist標簽的使用
ss
--d
3.?re: JavaMail(4)--使用POP3接收郵件
郵件信息可以打印出來,可是下載郵件會出錯是什么原因?
--琳喵喵0721
4.?re: JavaMail(4)--使用POP3接收郵件
評論內容較長,點擊標題查看
--流風
5.?re: 操作PDF文件
評論內容較長,點擊標題查看
--ly.wolf
閱讀排行榜
1.?struts2 checkboxlist標簽的使用(18234)
2.?struts2異常攔截器(5862)
3.?struts2迭代標簽(3847)
4.?用freemind 秒殺Spring Security(1920)
5.?加載順序會影響對spring bean 的調用。(1491)
線程--條件Condition
Posted on 2009-12-23 22:50
啥都寫點
閱讀(440)
評論(0)
編輯
收藏
所屬分類:
J2SE
本例介紹一個籃子程序,為了簡化問題,籃子中最多只能有一個蘋果。消費者必須在籃子里有蘋果的時候才能吃蘋果,否則它必須暫時放棄對籃子的鎖定,等到生產者往籃子里放了蘋果后再去拿來吃。而生產者也必須等到籃子空了才能往里放蘋果,否則它也需要暫時解鎖等消費者把蘋果吃了才能往籃子里放蘋果。
通過Lock的newCondition方法創建Condition對象。
Condition的await方法使當前線程進入等待狀態,并且釋放它占據的Lock,直到有其他線程喚醒當前線程時,重新占有Lock。
Condition的signal方法喚醒其他正在等待該Condition的線程。
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
java.util.concurrent.locks.Condition;
import
java.util.concurrent.locks.Lock;
import
java.util.concurrent.locks.ReentrantLock;
/** */
/**
* 有時候線程取得lock后需要在一定條件下才能做某些工作,比如說經典的Producer和Consumer問題。
* 在Java 5.0以前,這種功能是由Object類的wait(), notify()和notifyAll()等方法實現的,
* 在5.0里面,這些功能集中到了Condition這個接口來實現。
*/
public
class
ConditionTest
{
/** */
/**
* 籃子程序,這里為了簡化問題,籃子中最多只能有一個蘋果。
* Consumer必須在籃子里有蘋果的時候才能吃蘋果,否則它必須暫時放棄對籃子的鎖定,
* 等到Producer往籃子里放了蘋果后再去拿來吃。而Producer必須等到籃子空了才能往里放蘋果,
* 否則它也需要暫時解鎖等Consumer把蘋果吃了才能往籃子里放蘋果。
*/
public
static
class
Basket
{
//
鎖
Lock lock
=
new
ReentrantLock();
//
根據鎖產生Condition對象
Condition produced
=
lock.newCondition();
Condition consumed
=
lock.newCondition();
//
籃子中的蘋果數,最多為1
int
num
=
0
;
/** */
/**
* 生產蘋果,往籃子里放
*
@throws
InterruptedException
*/
public
void
produce()
throws
InterruptedException
{
//
獲得鎖
lock.lock();
System.out.println(
"
Producer get a lock
"
);
try
{
//
判斷是否滿足生產條件
while
(num
==
1
)
{
//
如果有蘋果,則不生產,放棄鎖,進入睡眠
//
等待消費者消費
System.out.println(
"
Producer sleep
"
);
consumed.await();
System.out.println(
"
Producer awaked
"
);
}
/**/
/*
生產蘋果
*/
Thread.sleep(
500
);
System.out.println(
"
Producer produced an Apple.
"
);
num
=
1
;
//
通知等待produced Condition的線程
produced.signal();
}
finally
{
lock.unlock();
}
}
/** */
/**
* 消費蘋果,從籃子中取
*
@throws
InterruptedException
*/
public
void
consume()
throws
InterruptedException
{
//
獲得鎖
lock.lock();
System.out.println(
"
Consumer get a lock
"
);
try
{
//
判斷是否滿足消費條件
while
(num
==
0
)
{
//
如果沒有蘋果,無法消費,則放棄鎖,進入睡眠
//
等待生產者生產蘋果
System.out.println(
"
Consumer sleep
"
);
produced.await();
System.out.println(
"
Consumer awaked
"
);
}
/**/
/*
吃蘋果
*/
Thread.sleep(
500
);
System.out.println(
"
Consumer consumed an Apple.
"
);
num
=
0
;
//
發信號喚醒某個等待consumed Condition的線程
consumed.signal();
}
finally
{
lock.unlock();
}
}
}
/** */
/**
* 測試Basket程序
*/
public
static
void
testBasket()
throws
Exception
{
final
Basket basket
=
new
Basket();
//
定義一個producer
Runnable producer
=
new
Runnable()
{
public
void
run()
{
try
{
basket.produce();
}
catch
(InterruptedException ex)
{
ex.printStackTrace();
}
}
}
;
//
定義一個consumer
Runnable consumer
=
new
Runnable()
{
public
void
run()
{
try
{
basket.consume();
}
catch
(InterruptedException ex)
{
ex.printStackTrace();
}
}
}
;
//
各產生3個consumer和producer
ExecutorService service
=
Executors.newCachedThreadPool();
for
(
int
i
=
0
; i
<
3
; i
++
)
{
service.submit(producer);
}
for
(
int
i
=
0
; i
<
3
; i
++
)
{
service.submit(consumer);
}
service.shutdown();
}
public
static
void
main(String[] args)
throws
Exception
{
ConditionTest.testBasket();
}
}
--
學海無涯
Powered by:
BlogJava
Copyright © 啥都寫點
主站蜘蛛池模板:
亚洲国产另类久久久精品黑人
|
91av在线免费视频
|
亚洲va久久久噜噜噜久久
|
亚洲色欲一区二区三区在线观看
|
华人在线精品免费观看
|
亚洲日本乱码一区二区在线二产线
|
免费影院未满十八勿进网站
|
亚洲色欲啪啪久久WWW综合网
|
亚洲免费视频一区二区三区
|
国产麻豆成人传媒免费观看
|
免费无码一区二区
|
久久久久久亚洲精品
|
成年女人喷潮毛片免费播放
|
caoporm超免费公开视频
|
亚洲精品视频在线免费
|
四虎影视精品永久免费
|
无码av免费一区二区三区试看
|
亚洲精品无码久久久久牙蜜区
|
国产亚洲精品无码拍拍拍色欲
|
国产91色综合久久免费分享
|
日本视频免费观看
|
久久亚洲欧美国产精品
|
亚洲AV日韩AV高潮无码专区
|
国产亚洲精品国看不卡
|
亚洲福利精品一区二区三区
|
思思re热免费精品视频66
|
国产自偷亚洲精品页65页
|
无码人妻久久一区二区三区免费丨
|
大片免费观看92在线视频线视频
|
亚洲最新中文字幕
|
少妇中文字幕乱码亚洲影视
|
亚洲福利精品一区二区三区
|
亚洲乱码日产精品a级毛片久久
|
国产一区视频在线免费观看
|
国产一区二区视频免费
|
heyzo亚洲精品日韩
|
思思re热免费精品视频66
|
永久免费毛片在线播放
|
最近最新MV在线观看免费高清
|
亚洲AV日韩AV永久无码色欲
|
国产亚洲一卡2卡3卡4卡新区
|