文档章节

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

牧羊人Berg
 牧羊人Berg
发布于 2015/10/16 00:01
字数 766
阅读 155
收藏 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
粉丝 24
博文 96
码字总数 87512
作品 0
深圳
私信 提问
学习笔记五:线程间的协作与通信

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

刘祖鹏
07/26
0
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
0
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
22
0
tomcat学习笔记

第一章 JVM原理 一、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写。 JAVA语言的平台无关性如何实现:通过Java虚拟机,Java语言在不同平台上运行时不需要重新编译。Java语言使用...

123654zf
2017/07/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql load data 批量导入使用

最近在研究使用mycat,其中有使用批量数据导入,简单记录一下使用方式。 查看系统属性 mysql>show variables like '%secure%'+--------------------------+-----------------------+| Vari...

FansinZhao
15分钟前
0
0
浅谈React的最大亮点——虚拟DOM

在Web开发中,需要将数据的变化实时反映到UI上,这时就需要对DOM进行操作,但是复杂或频繁的DOM操作通常是性能瓶颈产生的原因,为此,React引入了虚拟DOM(Virtual DOM)的机制。 一、什么是...

peakedness丶
18分钟前
0
0
下一代大数据处理引擎,阿里云实时计算独享模式重磅发布

摘要: 11月14日,阿里云重磅发布了实时计算独享模式,即用户独享一部分物理资源,这部分资源在网络/磁盘/CPU/内存等资源上跟其他用户完全独立,是实时计算在原有共享模式基础上的重大升级。...

阿里云官方博客
23分钟前
0
0
Spring MVC 测试样例

1、需要javax.servlet-api V3.0以上支持 <!--3.0以上版本--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-......

jcc_codingBoy
25分钟前
2
0
kettle增量同步oracle数据到mysql

kettle增量同步oracle数据到mysql 适合表中有更新时间的字段 kettle安装 绿色,下载后解压即可(略), -> Download 连接数据库 需要导入jdbc相关驱动jar包到lib目录(oracle、mysql对应jar...

o00o
30分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部