2011-06-15 87 views
2
Class Producer implements Runnable 
    Q q; 

    Producer(Q q) { 
     this.q = q; // line- 5 
     new Thread(this, "Producer").start(); 
    } 
    public void run(){ 
     int i = 0; 
     while(true){ 
     q.put(i++); 
     } 
    } 
} 

嘿,任何人都可以请告诉我: 1.在第5行,这是哪些q? 2.为什么在第6行没有实例化对象?直接启动函数被调用? 谢谢...线程通信程序

+0

这很可能是杀死你的系统的好方法。根据实现方式的不同,q.put()可能会为每次调用创建一个或两个对象,从而导致GC线程达到最大值。默认行为是使用系统上的所有内核来执行此操作。除非你有非常快的消费者,否则你很可能会耗尽内存,这至少会阻止制片人。在main()函数中,新生产者(q)(其中q是Q的一个对象)中的 – 2011-06-15 09:33:29

回答

0

5号线 - q实例变量设置为传递给生产者构造函数的q值。

Line 6 - 一个新的线程被实例化。它从构造函数返回,并立即调用start方法。

+0

被写入。现在我的问题是,this.q和q有什么区别?这用于引用调用者?但是这里没有任何对象调用这个构造函数 – 2011-06-15 09:29:49

+0

关键字this指的是当前的Object实例 - 所以它指的是实例变量,即“Q q;” – planetjones 2011-06-15 09:31:07

+0

Then calling new Producer(q); 将与 完全一样生产者re = new Producer(q); 如果是这样,那么第二种方法是有用的? – 2011-06-15 09:44:01

0
  • this.q是在第2行
  • 平原q声明的实例变量q在管线中声明的构造符参数4
  • 在第6行中,对象经由new实例化,则start方法是立即呼吁它。没有任何明确提及保存的对象。但是,由于它用于启动线程,因此它将在该线程中隐式引用,因此在线程完成之前不会变为垃圾收集的条件。
+0

谢谢,这是最有帮助 – 2011-06-15 09:33:57

+0

然后 致电 新制片人(q); 将与 完全一样生产者re = new Producer(q); 如果是这样,那么第二种方法是有用的? – 2011-06-15 09:42:31

+0

@Abhay:第二种方式保持对对象的引用're',以便您可以调用它的方法或将它作为参数传递给它。大多数物体没有参考就没用了。 – 2011-06-15 10:28:13

0

在第5行,类private(this。)q通过在构造函数中传递的q实例化。

在第6行创建了一个新的线程,但该对象从不再使用,所以这只是一个简短的方法。

Thread t = new Thread(this,"Producer"); 
    t.start(); 

是相当于

new Thread(this,"Producer").start(); 
+0

Then calling new Producer(q); 将与 完全一样生产者re = new Producer(q); 如果是这样,那么第二种方法是有用的? – 2011-06-15 09:43:21

+0

新制片人(q)只是制作人。在这种情况下,你不能在任何后面的代码中使用该对象。如果你不需要它,这很好。如果你稍后需要这个对象(在你的情况'重新'),你会用第二种方式! – 2011-06-15 10:25:04

0
  1. 在声明this.q = q;this.q指类的实例的q领域,而q指参数。
  2. new Thread(this, "Producer")创建Thread类的新实例,所以是的,在调用start()方法之前实例化对象。
0

在第5行,this.q指的是当前构造的Producer对象的字段q。第二个q引用构造函数参数,即已传递给构造者的Q

在第6行,有一个新的Thread对象构造。它只是没有分配给任何变量。而是直接调用start()方法。当不需要提及Thread对象时,这是一种常见模式。

可以与此相当的代码替换它:

Thread thread = new Thread(this, "Producer"); 
thread.start(); 

这将有完全相同的效果。

+0

好的谢谢,刚刚确认 – 2011-06-15 09:33:45

+0

然后 打电话 新制片人(q); 将与 完全一样生产者re = new Producer(q); 如果是这样,那么第二种方法是有用的? – 2011-06-15 09:45:32

+0

@Abhay:第二种方式是比较常见的方法,因为*通常*一个对象实际上不会*做任何事情,除非您调用它的方法。这意味着你通常想要在变量中保留对它的引用。 'Thread'在这里略有不同:一旦你调用'start()',它就会自行运行。你*只需要坚持下去,如果你以后需要检查它的状态或类似的东西。 – 2011-06-15 10:22:35