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开始,并且仍然是向后兼容的.
CKi*_*ing 48
为什么Thread类是作为常规类实现的,而不是run()方法是抽象的抽象类.
这个问题实际上归结为这样一个事实:你应该总是喜欢组合而不是继承.
如果Thread
该类被声明为abstract
,则该语言必须提供另一个从其扩展的类,程序员可以使用该类来创建一个类Thread
.那么你的问题是,为什么这个类是extends
从Thread
没有abstract
.如果语言没有提供其他类extends
从Thread
,程序员必须创建自己的类,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)