我从一个朋友那里听说了一个面试问题。
将可运行对象传递给扩展Thread类的类的对象,并启动该类,会发生什么情况?
public class A extends Thread {
Runnable obj;
public A(Runnable obj) {
this.obj=obj;
}
public void run() {
System.out.println("Printing A")
}
}
public class B implements Runnable {
public void run() {
System.out.println("Printing B");
}
}
public class MainApp {
public static void main() {
B b = new B();
A a = new A(b);
a.start();
}
}
输出打印A
我期待打印B,因为它是一个完美的类比
Thread obj = new Thread(Runnable runnableObj)
谁能解释一下这个奇怪的输出?? 线程有一个run
方法,本质上是调用runnable.run()
。除了在你的类A
中,你已经覆盖了该方法来做其他事情。
所以runnable.run()
不再叫了
您正在创建一个instance of class A
(现在它是Thread
)。
那么你正在调用using instance a
线程的start()
。
你只是在传递一个Runnable object as a normal instance variable to class A.
这没什么复杂的。
检查结果正常
稍微调整一下,您的代码就会像预期的那样运行。
public class A extends Thread {
Runnable obj;
public A(Runnable obj) {
this.obj = obj;
}
public void run() {
System.out.println("Printing A");
obj.run();// <---- I added this.
}
}
public class B implements Runnable {
public void run() {
System.out.println("Printing B");
}
}
public void test() {
B b = new B();
A a = new A(b);
a.start();
}
问题是您在Thread上重写了run()方法,而从未将Runnable对象传递给super()。试试这个:
public class A extends Thread {
public A(Runnable obj) {
super(obj);
}
public class B implements Runnable {
public void run() {
System.out.println("Printing B");
}
}
public void test() {
B b = new B();
A a = new A(b);
a.start();
}
}