A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 卢祥洲 中级黑马   /  2013-5-28 08:07  /  1539 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 卢祥洲 于 2013-5-28 16:21 编辑

毕老师讲的多线程通讯第一个视频中,Input和Output类使用同一个对象:毕老师说用引用代替单例模式,想请教大家这引用怎么是同一个对象呢?
  1. class Resource{
  2.         String name;
  3.         String sex;        
  4. }
  5. class Input implements Runnable{
  6.         private Resource r;//引用1、代替单例模式
  7.         Input(Resource r){
  8.                 this.r = r;        
  9.         }        
  10.         public void run(){
  11.                 int x= 0;
  12.                 while(true){
  13.                         if(x==0){
  14.                                 r.name = "lili";
  15.                                 r.sex = "girl";        
  16.                         }        else{
  17.                                 r.name = "龟龟";
  18.                                 r.sex = "男";        
  19.                         }
  20.                         x = (x+1)%2;
  21.                 }        
  22.         }
  23. }
  24. class Output implements Runnable{
  25.         private Resource r;//引用2、代替单例模式
  26.         Output(Resource r){
  27.                 this.r = r;        
  28.         }        
  29.         public void run(){
  30.                 while(true){
  31.                         System.out.println(r.name+"******"+r.sex);        
  32.                 }        
  33.         }
  34. }
  35. class InputOutputDemo03{
  36.         public static void main(String[] args){
  37.                 Resource r = new Resource();
  38.                
  39.                 Input in = new Input(r);
  40.                 Output out = new Output(r);
  41.                
  42.                 Thread t1 = new Thread(in);
  43.                 Thread t2 = new Thread(out);
  44.                
  45.                 t1.start();
  46.                 t2.start();        
  47.         }        
  48. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

6 个回复

倒序浏览
早呀!!!呵呵。我跟你看的是一样的内容
首先:最简单的一个想法就是Resource仅仅只new了一次,对吧?
而且都是各个线程都只是引用同一个Resource对象,这是关键的一点
各个线程之间是不停切换的,所以传入的对象仅仅只是切换都不同的线程中去了,再也没有出现过new  Resource类,产生新对象
所以我想你应该懂呢???
【黑马云青年为你解答】

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
袁梦希 + 1 + 2 很给力!

查看全部评分

回复 使用道具 举报
Changer_s 发表于 2013-5-28 08:19
早呀!!!呵呵。我跟你看的是一样的内容
首先:最简单的一个想法就是Resource仅仅只new了一次,对吧?
而 ...

额,谢谢,懂了,在主线程里面只定义了一个Resource对象!
回复 使用道具 举报
嘿嘿,合作愉快!!!{:soso_e144:}
如果搞懂了,可以把问题的状态调成  已解决
回复 使用道具 举报
Changer_s 发表于 2013-5-28 08:19
早呀!!!呵呵。我跟你看的是一样的内容
首先:最简单的一个想法就是Resource仅仅只new了一次,对吧?
而 ...

很好
回复 使用道具 举报
袁梦希 发表于 2013-5-28 13:46
很好

好好加油,为了去黑马,更为了我们的梦想
黑马也许就是一个很好的开始!go ahead
回复 使用道具 举报
这就要涉及到对象的内存机制,我们都知道如果我们在java程序中实例化一个对象,那是要在堆内存中给对象分配一个实例化空间,就想如果你上面的代码不使用 Input(Resource r){
                this.r = r;        
        }     
而是使用
Resource rs=new Resource();
这样的话,内存中就自动生成一个Resource对象,这个对象要占用一定的内存空间,而你如果使用上面的那种方法,无论你是在Input还是在Output 中其实存放的都只是一个Resource对象的引用地址,并不会创建对象,这样一来这个对象就被引用了两次,也就是说Input和Output引用的是同一个对象。
说到这,给你一个忠告,如果你在以后的工作中从事IT的话,一定要注意如果能够不实例化对象就千万别实例化对象,因为这样耗内存,毕竟服务器的内存有限,你如果一直这样做的话,迟早有一天内存会耗尽。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马