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

Pac*_*ier 6 java polymorphism multithreading overriding

Java文档指出,如果我们提供一个Runnable 对象创建一个新的线程时,.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*421 16

因为您重写了Thread.run()方法.

这是Thread.run()的实现:

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试:

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

你会得到的ab.

  • @Pacerier从技术上讲,你不是在调用Thread.start(),而是调用_Thread $ 1_.start()(或者Java命名匿名类).所以文档是正确的.现在,也许有人会争辩说Thread.run()应该是最终的. (4认同)
  • 你是对的.考虑一下,"除非"部分适用于Java中不是最终的每个方法. (2认同)

Pet*_*rey 9

默认实现是调用Runnable.但是,您要覆盖默认实现,而不是调用runnable.解决这个问题最简单的方法是

    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("a");
        }
    }) {
        @Override
        public void run() {
            super.run(); // call the default implementation.
            System.out.println("b");
        }
    }.start();
Run Code Online (Sandbox Code Playgroud)

  • @Perception它更像是创造一个底部有一个洞的新饮水杯,然后向你的玻璃制造商抱怨你的玻璃杯没有水.;) (4认同)
  • @Pacerier - 就像打破一个水杯,然后向制造商抱怨它不再存在水. (3认同)