黑马程序员技术交流社区

标题: 关于毕老师多线程一个示例问题 [打印本页]

作者: 王少雷    时间: 2012-12-30 17:02
标题: 关于毕老师多线程一个示例问题
本帖最后由 王少雷 于 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();
求这三种写法,结果一样?不一样的话,哪两种写法不一样,求详解~~





作者: 马志军    时间: 2012-12-30 17:05
本帖最后由 马志军 于 2012-12-30 17:10 编辑

一样的。就好像说
int i=5;
System.out.println(i);
这i其它地方也没用它,直接套在一起System.out.println(5);这样简洁些
作者: 王少雷    时间: 2012-12-30 17:10
马志军 发表于 2012-12-30 17:05
一样的。就好像说
int i=5;
System.out.println(i);

纳尼?是么?我怎么越感觉越不一样。
作者: 马志军    时间: 2012-12-30 17:14
王少雷 发表于 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:16
马志军 发表于 2012-12-30 17:14
Product p = new Product(r);
把r换成r所表示的对象Resource r = new Resource();
Product p = new Produ ...

其实这么写,运行有一个问题,如果你发现了,就好像一个死锁一样。
作者: 马志军    时间: 2012-12-30 17:25
王少雷 发表于 2012-12-30 17:16
其实这么写,运行有一个问题,如果你发现了,就好像一个死锁一样。

new Resource()
这个不用换,Thread t1 = new Thread(new Product(r));
不然的话两个线程用的是不同的Resource对象,应该用同一个。可能是这原因
作者: 清水    时间: 2012-12-30 17:25
第一种用的是同一个资源r。
第三种用的是两个资源。
第二种,语法错了吧。p被注释了,咋用啊。
作者: 王少雷    时间: 2012-12-30 17:31
清冰 发表于 2012-12-30 17:25
第一种用的是同一个资源r。
第三种用的是两个资源。
第二种,语法错了吧。p被注释了,咋用啊。 ...

哦,第二种注释错了。没看到。呵呵。
第三种 为什么是两个资源。
作者: 谢毅    时间: 2012-12-30 17:37
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:45
王少雷 发表于 2012-12-30 17:31
哦,第二种注释错了。没看到。呵呵。
第三种 为什么是两个资源。

第三种new了两个资源
作者: 王少雷    时间: 2012-12-30 18:00
郭娇珍 发表于 2012-12-30 17:45
第三种new了两个资源

嗯。知道了。。。突然有点 犯晕了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2