匿名类线程

时间:2013-10-03 17:31:46

标签: java multithreading

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

有人可以解释一下,传递给线程的对象-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 个答案:

答案 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()将在与调用者相同的线程中执行。