为什么线程不是抽象类,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(); } }; } }