学习笔记3: 目标对象与线程的关系
学习笔记3: 目标对象与线程的关系
牧羊人Berg 发表于2年前
学习笔记3: 目标对象与线程的关系
  • 发表于 2年前
  • 阅读 127
  • 收藏 2
  • 点赞 1
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

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

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;
			}
		}
		
	}
}

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


共有 人打赏支持
粉丝 25
博文 96
码字总数 87512
×
牧羊人Berg
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: