对于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的更多相关文章

随机推荐

  1. 任务06——封装与单元测试(Markdown版)

    模块代码地址 Core 模块代码地址 单元测试代码地址 两个地址是一样的,为了方便,所以把测试的代码很模块代码放在一起git了. 封装阶段 public class Core { public sta ...

  2. 【转】 HMC与VIOS对新LPAR提供存储与网络虚拟化的支持

    前面的几篇博文的操作环境都是在IVM下,IVM可以看作是VIOS的一部分,或者是对VIOS功能的一个扩展,一个IVM只能管理1台物理服务器,而HMC则是一对多.在有HMC来管理物理服务器的情形下,VI ...

  3. 数字雨(Javascript使用canvas绘制Matrix,效果很赞哦)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. CentOS 7.4 下设置定时任务

    cron介绍 我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件. /var/spool/cron/ 目 ...

  5. 我的第二个Python小程序

    输出0-100之间的偶数: # Author: fansik # Description: Output an even number between 0 and 100 # method one n ...

  6. Nginx日志格式以及相关配置

    一.Nginx日志格式以及参数说明log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' ...

  7. 玩转git版本控制软件

    一.git的基本介绍 1.什么是git? git是个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版本管理.说白了就是个版本控制软件 2.git的使用方法 git软件是通过命令来实 ...

  8. mysql数据库中表的外键约束

    一.外键约束 1.什么是外键? 外键指的是其他表中的主键,当做该表的外键. 2.创建外键. 2.1 可在创建表的时候直接创建外键,如图所示: create table table_name  (字段名 ...

  9. tcpdump Demo

    tcpdump Demo lxw ~$ tcpdump -i eth0 tcpdump: eth0: You don't have permission to capture on that devi ...

  10. LeetCode:旋转图像【48】

    LeetCode:旋转图像[48] 题目描述 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使 ...