我有三个课程如下:
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()方法。
答案 0 :(得分:3)
我检查了Thread类的run()方法,发现它从Runnable类调用了run()方法
您已覆盖run
方法,以便ThreadInstance
不再执行此操作。
你需要选择一个或另一个。 覆盖run
中的Thread
或将Runnable
传递给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
。