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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王少雷 高级黑马   /  2012-12-30 17:02  /  2119 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王少雷 于 2012-12-30 18:00 编辑

毕老师有个多线程间通信 示例 消费者和生产 者
在主函数运行里面 调用时一段代码如下:
第一种写法:
                Resource r = new Resource();
                Product p = new Product(r);
                Cutmor c = new Cutmor(r);
                Thread t1 = new Thread(p);
                Thread t2 = new Thread(c);
                t1.start();
                t2.start();

第二种写法:
                Resource r = new Resource();
                //Product p = new Product(r);
                //Cutmor c = new Cutmor();
                Thread t1 = new Thread(new Product(r));
                Thread t2 = new Thread(new Cutmor(r));     
                t1.start();
                t2.start();
第三种写法:
                //Resource r = new Resource();
                //Product p = new Product(r);
                //Cutmor c = new Cutmor(new Product(r));
                Thread t1 = new Thread(new Product(new Resource()));
                Thread t2 = new Thread(new  Cutmor(new  Resource()));
                t1.start();
                t2.start();
求这三种写法,结果一样?不一样的话,哪两种写法不一样,求详解~~




10 个回复

倒序浏览
本帖最后由 马志军 于 2012-12-30 17:10 编辑

一样的。就好像说
int i=5;
System.out.println(i);
这i其它地方也没用它,直接套在一起System.out.println(5);这样简洁些
回复 使用道具 举报
马志军 发表于 2012-12-30 17:05
一样的。就好像说
int i=5;
System.out.println(i);

纳尼?是么?我怎么越感觉越不一样。
回复 使用道具 举报
王少雷 发表于 2012-12-30 17:10
纳尼?是么?我怎么越感觉越不一样。

Product p = new Product(r);
把r换成r所表示的对象Resource r = new Resource();
Product p = new Product(new Resource());
Thread t1 = new Thread(p);
  把括号中p再用p后面那个代入      
Thread t1 = new Thread(new Product(new Resource()));
就直接成这样了,一步到位,方便
   
回复 使用道具 举报
马志军 发表于 2012-12-30 17:14
Product p = new Product(r);
把r换成r所表示的对象Resource r = new Resource();
Product p = new Produ ...

其实这么写,运行有一个问题,如果你发现了,就好像一个死锁一样。
回复 使用道具 举报
王少雷 发表于 2012-12-30 17:16
其实这么写,运行有一个问题,如果你发现了,就好像一个死锁一样。

new Resource()
这个不用换,Thread t1 = new Thread(new Product(r));
不然的话两个线程用的是不同的Resource对象,应该用同一个。可能是这原因
回复 使用道具 举报
清水 中级黑马 2012-12-30 17:25:49
7#
第一种用的是同一个资源r。
第三种用的是两个资源。
第二种,语法错了吧。p被注释了,咋用啊。
回复 使用道具 举报
清冰 发表于 2012-12-30 17:25
第一种用的是同一个资源r。
第三种用的是两个资源。
第二种,语法错了吧。p被注释了,咋用啊。 ...

哦,第二种注释错了。没看到。呵呵。
第三种 为什么是两个资源。
回复 使用道具 举报
谢毅 中级黑马 2012-12-30 17:37:43
9#
Thread t1 = new Thread(new Product(new Resource()));其实是堆与堆的通信,堆是一个运行时数据区,要在运行时动态分配内存,存取速度较慢。
                Resource r = new Resource();
                Product p = new Product(r);
                Cutmor c = new Cutmor(r);
                Thread t1 = new Thread(p);
                Thread t2 = new Thread(c);
是栈与堆的通信,栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。
回复 使用道具 举报
王少雷 发表于 2012-12-30 17:31
哦,第二种注释错了。没看到。呵呵。
第三种 为什么是两个资源。

第三种new了两个资源
回复 使用道具 举报
郭娇珍 发表于 2012-12-30 17:45
第三种new了两个资源

嗯。知道了。。。突然有点 犯晕了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马