Java 将可运行实例传递给线程调用线程的run();s子类,而不是Runnable类的run()

Java 将可运行实例传递给线程调用线程的run();s子类,而不是Runnable类的run(),java,multithreading,runnable,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|");

我有以下三个班:

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.客户

public class Client{
    public static void main(String[] args) {
        new ThreadInstance(new RunnableInstance()).start();
    }
}
输出打印|扩展|而不是|实现|

在客户机类中,通过传递可运行实例来创建线程。因此,当这个线程运行时,应该调用Runnable类(RunnableInstance)的run()方法。但在上述情况下,调用了ThreadInstance的run()方法

我不想知道这背后的原因。谁能帮我解释一下我在这里遗漏了什么。我还检查了Thread类的run()方法,发现如果检查runnable实例是否为null,则它会从runnable类调用run()方法

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

您已经覆盖了
run
方法,因此
ThreadInstance
不再执行此操作

你需要选择其中一个。在
线程中重写
运行
,或者向其传递一个
可运行
。不是两者都有

从技术上讲,我们可以做到以下几点:

public class ThreadInstance extends Thread {
    public ThreadInstance() {}
    public ThreadInstance(RunnableInstance r) { super(r); }

    public void run() {
        super.run(); // note
        System.out.println("|Extend|");
    }
}
但这可能不是一个好主意,除非你真的知道自己在做什么。我们通常不应该更改
线程的行为

另见:

摘自以下文件:

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

因此,当您调用
start()
时,将调用
ThreadInstance
run
方法

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

// this is the run method of the base Thread class
public void run() {
    if (target != null) {
        target.run();
    }
}

但是,由于您重写了子类
ThreadInstance
中的
run
方法,因此它不再调用目标
RunnableInstance

您已经覆盖了thread类的
run
方法,并且您从未调用过超级实现,因此,从未调用过runnable

您根本不需要重写线程,但如果必须重写,您应该在
run
实现中调用
super.run()

dumb me…:)我怎么会错过呢。谢谢你,顺便问一下@AR.3:这个代码块(“这是run方法…”)是直接来自Java源代码的吗?