为什么线程不是抽象类,start()不是最终的?

为什么Thread类是作为普通类实现的,而不是抽象类,而run()方法是抽象类。

会不会引入任何问题? 或者它有什么用途呢?

此外, Thread.start()方法应该是一个非常具体的方法, 其function不能由任何其他类实现 (如果我没有错)。 因此,我猜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??"); } } 

这显然只是印刷,

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

除了让工程师replace你之外,还有其他用途吗?

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

为什么Thread类是作为普通类实现的,而不是抽象类,而run()方法是抽象类。

这个问题实际上归结为,你应该总是喜欢组合而不是inheritance。

如果Thread类被声明为abstract ,那么语言将不得不提供另外一个可以由程序员用来创buildThread 。 那么你的问题就是为什么这个从Thread extends出来的类不是abstract 。 如果语言没有提供从Thread extends另一个类,那么程序员将不得不创build他们自己的类,从Thread extend s并覆盖run()方法。

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

我可以给出的唯一可能的解释是,该语言的开发人员在将类引入到JDK时看到了一些用于重写start用例。 我使用的Java的第一个版本是1.5,我个人还没有遇到一个用例,我发现需要重写start 。 正如JB Nizet在答复中所述

如果Java今天从头开始重新devise,那么devise就会有所不同

你当然可以select在脚下自己射击,但这并不意味着你必须。

为什么Thread类是作为普通类实现的,而不是抽象类,而run()方法是抽象类。

因为推荐的创build线程的方式不是子类Thread。 推荐的方法是定义一个Runnable ,并将其作为parameter passing给Thread构造函数:

 Runnable r = new Runnable() { @Override public void run() { ... } }; Thread t = new Thread(r); t.start(); 

因此,我猜最后的关键字会比其他任何方法更适合。

是和不是。 你不能用你自己的实现来replacestart()的实现,但是如果你想要,你可以在start()中做更多的事情:

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

也就是说,如果Java今天从头开始重新devise,那么这个devise就有很大的不同。 请记住,这个类从Java 1.0开始,它仍然是向后兼容的。

为什么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(); } }; } }