review36
对于Thread(Runnable target)构造方法创建的线程,轮到它来享用CPU资源时,目标对象就会自动调用接口中的run()方法,因此,对于使用同一目标对象的线程,目标对象的成员变量自然就是线程共享的数据单元。
下面的例子中,房屋就是线程的目标对象,房屋中的一桶水被猫和狗共享。
public class Test07 { public static void main(String[] args) {
// TODO Auto-generated method stub
House house = new House();
house.setWater(10);
Thread dog, cat;
dog = new Thread(house);
cat = new Thread(house);
dog.setName("狗");
cat.setName("猫");
dog.start();
cat.start();
} }
House.java
public class House implements Runnable {
int waterAmount;
public void setWater(int w)
{
waterAmount = w;
} @Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
String name = Thread.currentThread().getName();
if(name.equals("狗"))
{
System.out.println(name + "喝水");
waterAmount = waterAmount -2;
}
else if(name.equals("猫"))
{
System.out.println(name + "喝水");
waterAmount = waterAmount - 1;
}
System.out.println(" 剩 " + waterAmount);
try{
Thread.sleep(2000);
}
catch(InterruptedException e){}
if(waterAmount <= 0)
{
return;
}
}
} }
运行结果如下所示:
目标对象可以组合线程,即将线程作为自己的成员(弱耦合)。
可以这样改
public class Test01 { public static void main(String[] args) {
// TODO Auto-generated method stub
House house = new House();
house.setWater(10);
house.dog.start();
house.cat.start();
} }
House.java
public class House implements Runnable { int waterAmount;
Thread dog, cat;
House()
{
dog = new Thread(this);
cat = new Thread(this);
}
public void setWater(int water)
{
waterAmount = water;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
Thread thread = Thread.currentThread();
if(thread == dog)
{
System.out.println("家狗喝水 -2");
waterAmount = waterAmount - 2;
}
else if(thread == cat)
{
System.out.println("家猫喝水 -1");
waterAmount = waterAmount - 1;
}
try{
Thread.sleep(2000);
}
catch(InterruptedException e){}
if(waterAmount <= 0)
{
return;
}
}
} }
运行结果如下所示:
review36的更多相关文章
随机推荐
- RocketMq的安装使用
RocketMq的安装使用 .一.预备环境 1.系统 Windows 2. 环境 JDK1.8.Maven.Git 1.下载 1.1地址:http://rocketmq.apache.org/rele ...
- Cassandra代替Redis?(转)
原文:Cassandra代替Redis? 最近用Cassandra的又逐渐多了,除了之前的360案例,在月初的QCon Shanghai 2013 篱笆网也介绍了其使用案例.而这篇百万用户时尚分享网站 ...
- graoovy资料
官网 http://www.groovy-lang.org/ 官方文档 http://www.groovy-lang.org/documentation.html Groovy入门教程 http:// ...
- spring下配置shiro
1.web.xml中加入shiro的过滤器: <!-- Spring --> <!-- 配置Spring配置文件路径 --> <context-param> < ...
- 如何用云存储和CDN加速网站图片视频、阿里云OSS的使用(转)
总有人说阿里云主机带宽小,那只是因为你还停留在单机架构上. 阿里的架构设计,云主机主要用来跑程序的,附件的存储和访问主要靠OSS. 有人又会说了,OSS按存储费+流量双重计费伤不起,只是你不知道OSS ...
- Python学习笔记3_数据类型
Python数据类型:数字.字符串.列表.元祖.字典 一.数字类型:(整型.长整型.浮点型.复数型) 1.整型(int):表示范围-2,147,483,648到2,147,483,647 2.长整型( ...
- iOS警告框和操作表
应用如何与用户交流呢? 警告框(AlertView)和操作表(ActionSheet)就是为此而设计的. 本文案例的原型草图如图3-48所示,其中有两个按钮“Test警告框”和“Test操作表”,点击 ...
- 佳能相机操作 EDSDK 教程 C# 版本
http://blog.csdn.net/zajin/article/details/17021339 介绍 佳能EOS数码SDK是一个 可以用来远程控制其数码单反相机相当强大的SDK.不幸的是 ...
- HDF 文件数据的读取
http://www.cams.cma.gov.cn/cams_973/cheres_docs/cheres_doc_sat.modis.1b.html一. HDF文件格式 1.概述 HDF 是美国国 ...
- LeetCode:二叉树的锯齿形层次遍历【103】
LeetCode:二叉树的锯齿形层次遍历[103] 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 ...