文档章节

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

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

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

刘祖鹏
07/26
0
0
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(一)

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

NashMaster2011
2015/01/08
0
0
tomcat学习笔记

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

123654zf
2017/07/05
0
0
一起学Python:线程-注意点

线程-注意点 1. 线程执行代码的封装 通过上一小节,能够看出,通过使用threading模块能完成多任务的程序开发,为了让每个线程的封装性更完美,所以使用threading模块时,往往会定义一个新的子...

祈澈姑娘
2017/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
3
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
3
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
3
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部