为什么Thread不是抽象类而start()不是final?

Cod*_*der 73 java multithreading

为什么Thread类被实现为常规类而不是抽象类,run()方法是抽象的.

它可能会引入任何问题吗?或者以这种方式有用吗?

此外,该Thread.start()方法应该是一个非常具体的方法,其功能不能由任何其他类实现(如果我没有错).因此我猜这个final关键字比任何其他方法更适合这个.

但是我可以覆盖这个方法并按我喜欢的方式使用它,

public class Test extends Thread {
    public static void main (String... args) {
        Thread test = new Test();
        test.start();
    }

    @Override
    public void run() {
        System.out.println("New thread started...");
    }

    @Override
    public void start() {
        System.out.println("Did anyone tell you I will spawn a new thread??");
    }
}
Run Code Online (Sandbox Code Playgroud)

它显然只是印刷,

有没有人告诉你我会产生一个新线程?

除了混淆工程师取代你之外,是否有任何超越的用途?

如果没有,为什么这个方法在Thread类中没有声明为final?

JB *_*zet 74

你当然可以选择用脚射击自己,但这并不意味着你必须.

为什么Thread类是作为常规类实现的,而不是run()方法是抽象的抽象类.

因为创建启动线程的推荐方法不是子类Thread.建议的方法是定义一个Runnable,并将其作为参数传递给Thread构造函数:

Runnable r = new Runnable() {
    @Override
    public void run() {
        ...
    }
};
Thread t = new Thread(r);
t.start();
Run Code Online (Sandbox Code Playgroud)

因此,我猜最终的关键字比任何其他方法都更适合.

是的,不是.您不能用自己的实现替换start()的实现,但如果您需要,可以在start()中执行其他操作:

@Override
public void start() {
    System.out.println("Did anyone tell you I will spawn a new thread??");
    super.start();
}
Run Code Online (Sandbox Code Playgroud)

也就是说,如果Java今天从头开始重新设计,那么设计很可能会有所不同.请记住,此类可以从Java 1.0开始,并且仍然是向后兼容的.

  • 没问题.它是开源的. (11认同)
  • @NayukiMinase没有.接口一直都是语言.自JDK 1.0以来存在Runnable. (2认同)

CKi*_*ing 48

为什么Thread类是作为常规类实现的,而不是run()方法是抽象的抽象类.

这个问题实际上归结为这样一个事实:你应该总是喜欢组合而不是继承.

如果Thread该类被声明为abstract,则该语言必须提供另一个从其扩展的类,程序员可以使用该类来创建一个类Thread.那么你的问题是,为什么这个类是extendsThread没有abstract.如果语言没有提供其他类extendsThread,程序员必须创建自己的类,extend从s Thread和覆盖run()方法.

如果没有,为什么方法没有在Thread类中声明为final?

我能给出的唯一可能的解释是,start当该类被引入JDK时,该语言的开发人员看到了一些用于覆盖的用例.我使用的第一个Java版本是1.5,我个人没有遇到过用例,我发现需要覆盖它start.正如JB Nizet在他的回答中所述

如果Java今天从头开始重新设计,那么设计很可能会有所不同


Sol*_*low 40

为什么Thread.start()final呢?

确定你永远不想覆盖它吗?

Class MyThreadFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable r) {
        return new Thread(r) {
            @Override
            public void start() {
                LOGGER.info("Starting thread " + this);
                super.start();
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)