java - 为什么 java.lang.Thread 在启动时不调用其显式 java.lang.Runnable 的 run() 方法?

标签 java multithreading polymorphism overriding

Java docs说明如果我们在创建新线程时提供一个 Runnable target,该线程的 .start() 将运行 run() 方法提供的可运行。

如果是这样的话,这个测试代码不应该打印“a”(而不是打印“b”)吗?

public class test {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("a");
            }
        };
        Thread t = new Thread(r) {
            @Override
            public void run() {
                System.out.println("b");
            }
        };
        t.start();
    }
}

最佳答案

因为你覆盖了Thread.run()方法。

这里是 Thread.run() 的实现:

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

尝试:

}) {
    @Override
    public void run() {
        super.run(); // ADD THIS LINE
        System.out.println("b");
    }
}.start();

你会得到ab

关于java - 为什么 java.lang.Thread 在启动时不调用其显式 java.lang.Runnable 的 run() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8619091/

相关文章:

java - 在数组中存储字节数组的最快方法?

java - CDI:通过静态方法获取对 beanManager 的引用

Java:将 if-return 语句封装在方法调用中以获得更干净、更简洁的代码?

java - AWT 事件线程中断

java - Spring数据-@Modifying(clearAutomatically = true,flushAutomatically = true)导致另一个实体无法更新

java - 如何从一个线程访问另一个线程的方法?

Python for 循环中的线程

java - 为什么在对象和 vector 之间进行选择时,Java 的多态性无法捕捉到正确的方法?

c++ - 多态性和类型转换

java - 为什么类变量的运行时多态性行为会发生变化