将Runnable实例传递给Thread调用Thread的子类run()而不是runnable类的run()

时间:2015-04-04 16:24:30

标签: java multithreading runnable

我有三个课程如下:

1.ThreadInstance

public class ThreadInstance extends Thread {
    public ThreadInstance() 
    {
    }
    public ThreadInstance(RunnableInstance r) {
        super(r);
    }
    public void run() {
        System.out.println("|Extend|");
    }
}

2.RunnableInstance

public class RunnableInstance implements Runnable {
    public void run() {
        System.out.println("|Implement|");
    }
}

3.Client

public class Client{
    public static void main(String[] args) {
        new ThreadInstance(new RunnableInstance()).start();
    }
}

OUTPUT打印|扩展|而不是|实施|

在Client类中,通过传递runnable实例来创建线程。所以当这个线程运行时,应该调用Runnable类(RunnableInstance)的run()方法。但在上面的例子中,调用了ThreadInstance的run()方法。

我并不清楚这背后的原因。请问有谁可以说明我在这里缺少的东西。我还检查了Thread类的run()方法,发现如果检查runnable实例是否为null,则它从Runnable类调用run()方法。

3 个答案:

答案 0 :(得分:3)

  

我检查了Thread类的run()方法,发现它从Runnable类调用了run()方法

您已覆盖run方法,以便ThreadInstance不再执行此操作。

你需要选择一个或另一个。 覆盖run 中的ThreadRunnable传递给public class ThreadInstance extends Thread { public ThreadInstance() {} public ThreadInstance(RunnableInstance r) { super(r); } public void run() { super.run(); // note System.out.println("|Extend|"); } } 。不是两个。

从技术上讲,可以做以下事情:

Thread

但除非你真的知道自己在做什么,否则这可能不是一个好主意。我们通常不应该改变{{1}}的行为。

另见:

答案 1 :(得分:2)

来自Thread#start()的Javadoc:

  

使该线程开始执行; Java虚拟机调用此线程run方法。

因此,当您致电start()时,run的{​​{1}}方法会被调用。

请注意,类ThreadInstance默认 run方法会调用目标Thread类的run

Runnable

但是,由于您覆盖了子类// this is the run method of the base Thread class public void run() { if (target != null) { target.run(); } } 中的run方法,因此它不再调用目标ThreadInstance

答案 2 :(得分:0)

你已经超越了线程类的run方法而且你从不调用超级实现,因此,runnable永远不会被调用。

您根本不需要覆盖该主题,但如果必须,您应该在super.run()实施中致电run