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行没有实例化对象?直接调用启动函数?谢谢
第5行-q实例变量设置为传递给Producers构造函数的q值。
第6行-实例化一个新线程。它从构造函数返回自身,并立即调用start方法。
this.q
是第2行中声明的实例变量q
- 普通
q
是第4行中声明的构造函数参数 - 在第6行中,通过
new
实例化对象,然后立即调用start
方法。只是没有保留对该对象的任何显式引用。然而,由于它是用来启动线程的,因此它将在该线程中被隐式引用,因此在线程完成之前,它不符合垃圾收集的条件
在第5行,类的private(this.(q用构造函数中传递的q实例化。
在第6行,创建了一个新的Thread,但该对象再也不用了,所以这只是一个很短的方法。
Thread t = new Thread(this,"Producer");
t.start();
相当于
new Thread(this,"Producer").start();
- 在语句
this.q = q;
中,this.q
表示类实例的q
字段,而q
表示参数 new Thread(this, "Producer")
创建Thread
类的一个新实例,因此是的,在调用start()
方法之前实例化一个对象
在第5行,this.q
指当前构造的Producer
对象的字段q
。第二个q
是指构造函数参数,即已传递给构造函数的Q
。
在第6行上,构造了一个新的Thread
对象。它只是没有分配给任何变量。相反,直接调用start()
方法。当不需要引用Thread
对象时,这是一种常见的模式。
您可以将其替换为以下等效代码:
Thread thread = new Thread(this, "Producer");
thread.start();
这将产生完全相同的效果。