Java 将可运行实例传递给线程调用线程的run();s子类,而不是Runnable类的run()
我有以下三个班: 1.ThreadInstanceJava 将可运行实例传递给线程调用线程的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|");
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
方法
请注意,classThread
的默认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源代码的吗?