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 © 啥都寫點
主站蜘蛛池模板:
亚洲理论电影在线观看
|
可以免费观看的一级毛片
|
亚洲一区二区三区AV无码
|
国产成人亚洲精品无码AV大片
|
一个人免费观看视频www
|
久久水蜜桃亚洲av无码精品麻豆
|
叮咚影视在线观看免费完整版
|
久久久久亚洲AV成人网人人软件
|
在免费jizzjizz在线播
|
亚洲综合视频在线
|
99视频免费观看
|
亚洲免费网站在线观看
|
99久久这里只精品国产免费
|
一本色道久久88亚洲精品综合
|
一个人免费观看在线视频www
|
亚洲精品无码久久久久YW
|
国产一区二区免费在线
|
人人鲁免费播放视频人人香蕉
|
亚洲日韩中文在线精品第一
|
国产成人精品久久亚洲高清不卡
|
亚洲熟妇无码AV
|
性做久久久久免费看
|
人碰人碰人成人免费视频
|
亚洲国产另类久久久精品小说
|
亚洲av无码成人黄网站在线观看
|
无码一区二区三区免费
|
77777午夜亚洲
|
国产成人免费ā片在线观看
|
九九热久久免费视频
|
久久亚洲国产成人精品性色
|
成人特黄a级毛片免费视频
|
羞羞网站免费观看
|
亚洲AV无码久久寂寞少妇
|
免费福利网站在线观看
|
日韩在线视频免费
|
久久亚洲中文字幕精品有坂深雪
|
亚洲日本国产精华液
|
日韩视频免费一区二区三区
|
9久热精品免费观看视频
|
亚洲熟妇av一区
|
亚洲av再在线观看
|