文档章节

学习笔记3: 目标对象与线程的关系

berg-dm
 berg-dm
发布于 2015/10/16 00:01
字数 766
阅读 237
收藏 2

从对象和对象之间的关系角度上来看,目标对象和线程的关系有以下两种关系:

1。 目标对象与线程完全解耦 

        如下: 创建目标对象的House类并没有组合cat和dog线程对象,也就是说House创建的目标对象不包含对cat和dog线程对象的引用(完全解耦)。这种情况下,目标对象经常需要通过获得线程的名字,因为无法获得线程对象的引用。即:

String name = Thread.currentThread().getName();

    以便确定是那个线程正在占用CPU资源,即被JVM正在执行的线程。 附上完整代码段:

public class DemoThread3 {

	/**
	 * @author 牧羊的伯格女皇
	 * @param args
	 * 2015-10-15
	 * 模拟猫和狗的线程,共享房屋中的一桶水。即房屋是线程的目标对象。
	 * 当水被喝完后 猫和狗 进入死亡状态 
	 */
	public static void main(String[] args) {
		House house = new House();
		house.setWaterAmount( 10 );
		Thread dog;  //用Thread 声明线程 
		Thread cat;
		dog = new Thread( house ); //  dog 和 cat 的目标对象相同 都是house 
		cat = new Thread( house ); //  
		dog.setName("狗");  // 改变线程名称,使之与参数name相同
		cat.setName("猫");
		dog.start();   // 启动线程 
		cat.start();
	}

}


public class House implements Runnable {
	private int waterAmount;
	public void setWaterAmount(int waterAmount) {
		this.waterAmount = waterAmount;
	}
	@Override
	public void run() {
		while(true){
			// currentThread() : 返回对当前正在执行的线程对象的引用。
				// getName()  返回该线程的名称。 
			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) {
				//当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常。
				e.printStackTrace();
			}
			if( waterAmount <=0 ){
				return;
			}
		}
	}

}



    2. 目标对象组合线程(弱耦合)

        目标对象可以组合线程,即将线程作为自己的成员(弱耦合),比如让线程cat和dog在HOuse中。创建目标对象的类组合线程对象时,目标对象可以通过获得线程对象的引用:

Thread.currentThread();

    通过上局代码来确定是哪个线程正在占用cpu资,即JVM正在执行的线程。

    附上完整代码段:

public class DemoThread4 {

	public static void main(String[] args) {
		House house = new House();
		house.setWaterAmount(10);
		house.dog.start();
		house.cat.start();

	}

}


public class House implements Runnable {
	int waterAmount; 
	Thread dog;   // 线程是目标对象的成员
	Thread cat;  // 线程是目标对象的成员
	
	House(){
		dog = new Thread(this);  // 当前House对象作为线程的目标对象
		cat = new Thread(this);
	}
	
	public void setWaterAmount(int w){
		waterAmount = w;
	}

	@Override
	public void run() {
		while(true){
			Thread t = Thread.currentThread();
			if( t == dog ){
				System.out.println(  "Dog喝水");
				waterAmount = waterAmount - 2;
			}else if( t == cat ){
				System.out.println( "Cat喝水");
				waterAmount = waterAmount -1;
			}
			System.out.println(" 还剩余 : " + waterAmount );
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				//当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常。
				e.printStackTrace();
			}
			if( waterAmount <=0 ){
				return;
			}
		}
		
	}
}

    注: 应当根据实际情况确定目标对象和线程是组合或完全解耦关系,两种关系各有优缺点。


© 著作权归作者所有

berg-dm
粉丝 26
博文 98
码字总数 88970
作品 0
深圳
程序员
私信 提问
学习笔记五:线程间的协作与通信

常见的线程之间通信方式有如下几种: 1、wait和notify/notifyAll 2、await和signal/signalAll 3、sleep/yield/join 4、同步屏障CyclicBarrier 5、CountDownLatch 闭锁 6、Semaphore 信号量 ...

刘祖鹏
2018/07/26
23
0
Handler Looper Message

Android(1)-Handler Looper Message MessageQueue http://www.cnblogs.com/TS-qrt/articles/android.html Android学习笔记——从源码看Handler的处理机制 http://www.cnblogs.com/yjiyjige/......

当空皓月
2014/10/23
50
0
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(一)

(本文示例完整源代码与数据库脚本下载地址:http://down.51cto.com/data/1970833) 在MyBatis中,当我们编写好访问数据库的映射器接口后,MapperScannerConfigurer就能自动成批地帮助我们根...

NashMaster2011
2015/01/08
0
0
ThreadLocal源码笔记

最近用到了ThreadLocal,所以看了一下JDK的源码。ThreadLocal是以空间换时间的典型,因为它避免了使用synchronized关键字来对变量加锁,从而节约了很多时间。ThreadLocal是为每个线程创建一个...

JoeyXie
2016/02/02
37
0
Nebula3学习笔记(3): 核心库

核心子系统 核心库(Core namespace)实现了这些特性: 一个实现了引用计数的RefCounted基类 一个运行时类型信息系统(RTTI) 一个模板智能指针, 用于处理RefCounted对象的生命周期 一个由类名创建...

长平狐
2012/11/12
49
0

没有更多内容

加载失败,请刷新页面

加载更多

Taro 兼容 h5 踩坑指南

最近一周在做 Taro 适配 h5 端,过程中改改补补,好不酸爽。 本文记录📝遇到的问题,希望为有相同需求的哥们👬节约点时间。 Taro 版本:1.3.9。 解决跨域问题 h5 发请求会报跨域问题,需...

dkvirus
55分钟前
3
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
今天
3
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
今天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
今天
19
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部