0

我创建了一个匿名类并将其传递给一个线程,当我启动线程时,它运行自己的类..

有人可以解释一下,传递给线程的 object-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();


    }
}
4

4 回答 4

6

当您将 aRunnable作为构造函数参数传递给 时Thread,它会设置一个名为 的实例字段target,它通常在start()s 时使用该字段。

但是你已经覆盖Thread#run()了通常

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

public void run(){
    System.out.println("Dog");
}

在您创建的匿名类中。

所以你的代码运行而不是执行你的实例target.run()在哪里。targetRunnable

于 2013-10-03T17:33:40.137 回答
0

Whenever you start a thread, java.lang.Thread's run() function is called. If you look at the source code of Thread.java, it first checks for the target, which is the Runnable passed in the constructor of the Thread class. This runnable is nothing but your class that has implemented the Runnable interface and thus overridden its run() function.

Since its the run function of the runnable now that is used, you should implement the logic inside your runnable. Keep in mind, that a new OS thread will be only launched by Thread class if target/runnable is not null, otherwise Thread.run() will execute in the same thread as the caller.

于 2013-10-03T17:49:13.103 回答
0

Thread'方法的 javadocrun说:

如果该线程是使用单独的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则,此方法不执行任何操作并返回。

javadoc forstart说它只是调用run. 我没有看到任何其他运行该Runnable对象的东西。所以我认为我们可以假设运行r对象的唯一方法是通过类的run方法Thread。但是,您已经覆盖了它。

如果您希望您的覆盖run方法也运行该r对象,请考虑在您的某处添加它run

super.run();
于 2013-10-03T17:42:54.490 回答
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     }

如果您通过构造函数传递可运行对象,则它会执行但是在这里您在匿名内部类中覆盖了 Thread 类本身的 run 方法,因此它执行了被覆盖的方法。

于 2013-10-03T17:39:39.647 回答