我创建了一个匿名类并将其传递给一个线程,当我启动线程时,它运行自己的类..
有人可以解释一下,传递给线程的对象-r会发生什么?
public class Interface1{
public static void main(String[] args){
Runnable r = new Runnable(){
public void run(){
System.out.println("Cat");
}
};
Thread t = new Thread(r){
public void run(){
System.out.println("Dog");
}
};
t.start();
}
}
答案 0 :(得分:6)
当您将Runnable
作为构造函数参数传递给Thread
时,它会设置一个名为target
的实例字段,它通常在start()
时使用。
但你已经覆盖了Thread#run()
,这通常是
@Override
public void run() {
if (target != null) {
target.run();
}
}
带
public void run(){
System.out.println("Dog");
}
在您创建的匿名课程中。
所以运行代码,而不是执行target.run()
,其中target
是您的Runnable
实例。
答案 1 :(得分:0)
如果您在Thread.java -
中看到代码634 public void [More ...] run() {
635 if (target != null) {
// target is runnable instance which initialized in constructor
636 target.run();
637 }
638 }
如果你通过构造函数传递runnable对象然后执行但是在这里你在你的Anonymous内部类中重写Thread类本身的run方法,所以它执行了覆盖方法。
答案 2 :(得分:0)
Thread
的{{1}}方法的javadoc说:
如果使用单独的
run
运行对象构造此线程,则调用该Runnable
对象的Runnable
方法;否则,此方法无效并返回。
run
的javadoc说它只是调用start
。我没有看到任何运行run
对象的内容。所以我认为我们可以假设运行Runnable
对象的唯一方法是通过r
类的run
方法。但是,你已经覆盖了它。
如果您希望覆盖Thread
方法同时运行run
对象,请考虑在r
中的某处添加:{/ p>
run
答案 3 :(得分:0)
每当启动一个线程时,都会调用java.lang.Thread的run()函数。如果查看Thread.java的源代码,它首先检查目标,这是在Thread类的构造函数中传递的Runnable。这个runnable只是你的类已经实现了Runnable接口,因此覆盖了它的run()函数。
由于现在使用runnable的run函数,你应该在runnable中实现逻辑。请记住,如果target / runnable不为null,则新的OS线程将仅由Thread类启动,否则Thread.run()将在与调用者相同的线程中执行。