将一个Runnable对象传递给一个扩展Thread类的类,然后启动它会打印出意外的结果



我从一个朋友那里听说了一个面试问题。

将可运行对象传递给扩展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();
    }
}

最新更新