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)
线程--Exchanger
Posted on 2009-12-24 21:31
啥都写点
阅读(236)
评论(0)
编辑
收藏
所属分类:
J2SE
本例介绍第四个同步装置:Exchanger,它让两个线程呼唤信息。本实例模拟服务生和顾客,服务生往空杯子中倒水,顾客从装满水的杯子中喝水,然后互换杯子,服务生接着倒水,顾客接着喝水。
初始化Exchanger对象时,可以通过泛型指定杯子能交换的信息类型。如“new Exchanger<String>;” 表示只能交换String类型的信息。
Exchanger的exchanger方法表示当前线程准备交换信息,等待其他线程与它交换信息。当有其他线程调用该Exchanger对象的exchange方法时,立即交换信息。
import
java.util.concurrent.Exchanger;
/** */
/**
* Exchanger让两个线程可以互换信息。
* 例子中服务生线程往空的杯子里倒水,顾客线程从装满水的杯子里喝水,
* 然后通过Exchanger双方互换杯子,服务生接着往空杯子里倒水,顾客接着喝水,
* 然后交换,如此周而复始。
*/
public
class
ExchangerTest
{
//
描述一个装水的杯子
public
static
class
Cup
{
//
标识杯子是否有水
private
boolean
full
=
false
;
public
Cup(
boolean
full)
{
this
.full
=
full;
}
//
添水,假设需要5s
public
void
addWater()
{
if
(
!
this
.full)
{
try
{
Thread.sleep(
5000
);
}
catch
(InterruptedException e)
{
}
this
.full
=
true
;
}
}
//
喝水,假设需要10s
public
void
drinkWater()
{
if
(
this
.full)
{
try
{
Thread.sleep(
10000
);
}
catch
(InterruptedException e)
{
}
this
.full
=
false
;
}
}
}
public
static
void
testExchanger()
{
//
初始化一个Exchanger,并规定可交换的信息类型是杯子
final
Exchanger
<
Cup
>
exchanger
=
new
Exchanger
<
Cup
>
();
//
初始化一个空的杯子和装满水的杯子
final
Cup initialEmptyCup
=
new
Cup(
false
);
final
Cup initialFullCup
=
new
Cup(
true
);
//
服务生线程
class
Waiter
implements
Runnable
{
public
void
run()
{
Cup currentCup
=
initialEmptyCup;
try
{
int
i
=
0
;
while
(i
<
2
)
{
System.out.println(
"
服务生开始往杯子中添水:
"
+
System.currentTimeMillis());
//
往空的杯子里加水
currentCup.addWater();
System.out.println(
"
服务生添水完毕:
"
+
System.currentTimeMillis());
//
杯子满后和顾客的空杯子交换
System.out.println(
"
服务生等待与顾客交换杯子:
"
+
System.currentTimeMillis());
currentCup
=
exchanger.exchange(currentCup);
System.out.println(
"
服务生与顾客交换杯子完毕:
"
+
System.currentTimeMillis());
i
++
;
}
}
catch
(InterruptedException ex)
{
}
}
}
//
顾客线程
class
Customer
implements
Runnable
{
public
void
run()
{
Cup currentCup
=
initialFullCup;
try
{
int
i
=
0
;
while
(i
<
2
)
{
System.out.println(
"
顾客开始喝水:
"
+
System.currentTimeMillis());
//
把杯子里的水喝掉
currentCup.drinkWater();
System.out.println(
"
顾客喝水完毕:
"
+
System.currentTimeMillis());
//
将空杯子和服务生的满杯子交换
System.out.println(
"
顾客等待与服务生交换杯子:
"
+
System.currentTimeMillis());
currentCup
=
exchanger.exchange(currentCup);
System.out.println(
"
顾客与服务生交换杯子完毕:
"
+
System.currentTimeMillis());
i
++
;
}
}
catch
(InterruptedException ex)
{
}
}
}
new
Thread(
new
Waiter()).start();
new
Thread(
new
Customer()).start();
}
public
static
void
main(String[] args)
{
ExchangerTest.testExchanger();
}
}
--
学海无涯
Powered by:
BlogJava
Copyright © 啥都写点