Cyh的博客
Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220
导航
BlogJava
首页
新随笔
联系
聚合
管理
公告
一直努力努力努力,像奴隶奴隶奴隶!~~
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
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
常用链接
我的随笔
我的文章
我的评论
我的参与
最新评论
随笔档案
(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标签的使用(18226)
2. struts2异常拦截器(5857)
3. struts2迭代标签(3845)
4. 用freemind 秒杀Spring Security(1914)
5. 加载顺序会影响对spring bean 的调用。(1489)
线程--条件Condition
Posted on 2009-12-23 22:50
啥都写点
阅读(436)
评论(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 © 啥都写点