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的更多相关文章
随机推荐
- mysql_用户_操作
一. 创建用户 登录MySQL mysql -u root -p 添加新用户 create user 'username'@'host' identified by 'password'; usern ...
- js四则运算符
只有当加法运算时,其中一方是字符串类型,就会把另一个也转为字符串类型.其他运算只要其中一方是数字,那么另一方就转为数字.并且加法运算会触发三种类型转换:将值转换为原始值,转换为数字,转换为字符串. & ...
- VM安装之分区、自定义安装包
一.分区 1.一般分为3个区:/root .swap./ 1)./root:引导分区.存放引导文件和Linux内核等. 启动文件:用于判断你需要启动哪个操作系统或者哪个内核: 内核:程序与硬件之间的桥 ...
- Python2 和 Python3 区别汇总
[Python2 和 Python3 的区别汇总,不定期补充] print 在进行程序调试时用得最多的语句可能就是 print,在 Python 2 中,print 是一条语句,而 Python3 中 ...
- python 获取当前运行的 class 和 方法的名字
# coding=utf-8 import sys class Hello(): def hello(self): print('the name of method is ## {} ##'.for ...
- 019-Spring Boot 日志
一.概述 spring-boot默认支持info级别的日志. 日志级别:trace.debug.info.warn.error.fatal.off[关闭] 二.配置日志级别 2.1.配置文件配置日志级 ...
- 20170520 BADI增强学习
一.要求:Tcode:FF_5 导入数据运行时,产生财务凭证之前修改某些字段值.Exmp:FEBRE-VWEZWBKPF-XBLNRFEBEP-CHECTBSEG-ZUONR there is a b ...
- MAXIMUM SUBSEQUENCE SUM PROBLEM
排除不合理的项(负值), 设定一个标杆sum, 往后扫描看是否有比sum好的情况. We should ensure the following conditions: 1. The result m ...
- jquery ajax属性async(同步异步)示例
在jquery的ajax中如果我们希望实现同步或者异步我们可以直接设置async发生为真或假即可true false,下面举几个jquery ajax同步和异步实例 例1.jquery+ajax/&q ...
- Loadrunder之脚本篇——参数化方法
导语 参数化旨在模拟多数据来进行测试,所以再选择参数化你明确你参数化的内容! 方法一 1.确定需要参数化的内容 2.选中需要参数化的内容 3.右键选中的内容->Replace with a Pa ...