文档章节

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

牧羊人Berg
 牧羊人Berg
发布于 2015/10/16 00:01
字数 766
阅读 152
收藏 2
点赞 1
评论 0

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

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
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
Nebula3学习笔记(3): 核心库

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

长平狐
2012/11/12
46
0
ThreadLocal源码笔记

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

JoeyXie
2016/02/02
22
0
Handler消息源码流程分析(含手写笔记)

在android开发中可谓随处可见,不论你是一个刚开始学习android的新人,还是昔日的王者,都离不开它。关于 的源码已经很前人分享过了。如果我没能给大家讲明白可以参考网上其他人写的。 注:文...

香脆的大鸡排
2017/07/15
0
0
后台开发常问面试题集锦(问题搬运工,附链接)

Java基础问题 String的’+’的性能及原理 java之yield(),sleep(),wait()区别详解-备忘笔记 深入理解Java Stream流水线 抽象 & abstract关键字 Java final 修饰符知识点总结(必看篇) Java中的...

大黄有故事
2017/11/18
0
0
多线程学习笔记(六)

在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源越多,也就是CPI优先执行优先级较高的线程对象中的任务. 设置线程优先级有助于帮线程规划器确定在下一次选择哪一个线程来优先...

scymore
2016/08/31
20
0
学习笔记2:java中Thread类与线程的创建

线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。...

牧羊人Berg
2015/10/15
38
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CentOS “Destination Host Unreachable”问题解决办法

挑战极速安装CentOS时遇到局域网主机不能通信的情况: [root@zjd network-scripts]# ping 8.8.8.8PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.64 bytes from 8.8.8.8: icmp_seq=1 ttl=......

wffger
15分钟前
0
0
CentoOS6.6安装netcat

CentOS下安装netcat 使用zookeeper过程中,需要监控集群状态。在使用四字命令时(echo conf | nc localhost 2181),报出如下错误:-bash: netcat: command not found。 我的系统是CentOS 6....

ghou-靠墙哭
26分钟前
0
0
es6之解构赋值巧用

ES6 允许按照一定模式,从数组、对象等中提取值,对变量进行赋值,这被称为解构赋值。 如何进行解构赋值我这里就不赘述,本篇文章主要是将解构赋值的巧妙使用之处。 1、交互变量的值 常用交互...

秋季长青
31分钟前
0
0
Elasitcsearch High Level Rest Client学习笔记(三)批量api

Bulk Request BulkRequest可以在一起从请求执行批量添加、更新和删除,至少需要添加一个操作 BulkRequest request = new BulkRequest(); //创建BulkRequestrequest.add(new IndexRequest("...

木子SMZ
35分钟前
0
0
mybatis-dynamic sql

OGNL expressions if 判断是否存在值 <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{tit......

writeademo
42分钟前
0
0
社交系统ThinkSNS+ V1.8.3更新播报

     研发发布版本号:1.8.3   本次版本于2018年7月16日发布   本次发布类型:新增功能、细节调整与优化   社交系统ThinkSNSPlus更新体验:请于官网下载/安装最新版或联系QQ35159...

ThinkSNS账号
45分钟前
0
0
教育思考:选择编程是一场父母和孩子的和解[图]

教育思考:选择编程是一场父母和孩子的和解[图]: 之前有个很热的段子是这样讲的:深夜十点的时候,某小区一女子大声喊叫“什么关系?啊?!到底什么关系?你说!”最后发现原来是一位妈妈陪...

原创小博客
46分钟前
0
0
X64汇编之指令格式解析

最近由于项目组内要做特征码搜索的东西,便于去Hook一些未导出函数,你懂得...于是就闲着学习了一下x86/x64的汇编指令格式。x86的汇编指令格式请参照http://bbs.pediy.com/showthread.php?t...

simpower
49分钟前
0
0
rust 语法概要(只适合不熟悉时快速查阅使用,不适合理解其精髓。未完待续)

注意:本内容只适合快查,不适合理解精髓。精髓请研读 https://kaisery.github.io/trpl-zh-cn/foreword.html 基本数据类型 i8,i16,i32,i64,i128 u8,u16,u32,u64,u128 f32,f64 char bool:true...

捍卫机密
52分钟前
0
0
JS中严格模式和非严格模式

1,使用 严格模式的使用很简单,只有在代码首部加入字符串 "use strict"。必须在首部即首部指其前面没有任何有效js代码除注释,否则无效 2.注意事项 (1)不使用var声明变量严格模式中将不通...

AndyZhouX
52分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部