实现Runnable与扩展线程

时间:2010-05-06 16:35:12

标签: java

为什么实现Runnable比从Thread类扩展更好?

6 个答案:

答案 0 :(得分:19)

实际要点是,在任何可疑案件的延伸下,工具总是优先考虑。

Extends非常接近地绑定两个类文件,并且可能会导致很难处理代码。

当我第一次“理解”OO编程时,我正在扩展一切,但它将我的整个设计变成了糊涂。现在我只是扩展了一些清楚明显地通过“是一个”测试的东西,其他一切都是一个界面......

许多问题刚刚停止发生(混淆多重继承情况,时间浪费重构层次结构,倾向于拥有“受保护”变量然后想知道为什么它们在当前类中没有更改它们时会发生变化,链接构造函数的需求,弄清楚不同的继承树如何相互作用,......

似乎每3年(过去20年),我认为我真的“得到”编程并回顾3年前我做的愚蠢事情...这是其中一个例子(但距离更近)到目前为止7年前)

答案 1 :(得分:8)

通过这种方式,你解除计算(什么)与执行(时间和/或如何)。

使用RunnableCallable,您可以向Executor提交许多工作/计算,这将照顾计划内容。以下是摘录形式ExecutorService

pool = Executors.newFixedThreadPool(poolSize);
...
pool.execute(new Handler(serverSocket.accept()));
...
class Handler implements Runnable {
    ...
 }

使用Runnable / Callable可以更灵活地直接使用线程。

答案 2 :(得分:3)

因为IS-A真的不是你想要的。你的班级想要成为Runnable,但是IS-A Thread感觉太强了。这就是继承所说的。你真的只想实现run()方法,而不是Thread类中的所有其他注意事项。

这符合Scott Meyers在“更有效的C ++”中的非常好的建议:使非叶类抽象化。替代接口,你就可以了。

答案 3 :(得分:2)

扩展Thread在继承层次结构中可能没有任何意义。如果您希望修改Thread s。

的功能,请仅展开Thread

使用Runnable,任何继承层次结构中的任何类都可以公开可以被视为工作单元的任务,以使Thread执行。

答案 4 :(得分:2)

您可能希望实施Interface Runnable以扩展Class Thread的原因如下:

    在顺序上下文中{li> 减少开销source
  

扩展Thread类时,每个线程都创建唯一的   对象并与之相关联。当您实现Runnable时,它共享   同一个对象到多个线程。

来源:a blog - 我不太确定这是否正确

  • 您可以使用Runnable通过网络发送任务(线程无法序列化,source
  • 更好 OOP风格
    • 你很可能没有“是一种”关系
    • 你有可能扩展其他类(Java没有多重继承)

答案 5 :(得分:0)

首先回答这个问题:

如果扩展线程,则类的实例(扩展线程)将始终调用超类线程的构造函数。所以     MyClass myclass = new MyClass() 将始终在MyClass的构造函数中调用“super()”来实例化一个线程,最后你可以在你的类中实现一些开销(如果你不使用超类线程的任何方法)。因此,只实现Runnable可以让您的类运行更快,而不会有任何继承的开销。

此外,这里有一些错误的答案:

  

现在我只是扩展了一些清楚明显地通过“is-a”测试的东西,其他一切都是一个接口......

你有没有考虑过没有任何界面来创建一个对象?因为为每个对象实现一个接口是非常错误的!

  

当您扩展Thread类时,每个线程都会创建唯一对象并与之关联。当您实现Runnable时,它将同一个对象共享给多个线程。

错误,每当你调用一个类的构造函数时,你都会得到一个自己的对象,它的扩展位置或实现方式无关紧要!

结论:在java中,每个类实例都是一个对象,并扩展了类Object(而基元不是......只有像int []类这样的基元数组扩展了Object,等等数组具有与任何对象相同的方法 - 但是在Javadoc中没有提到它们!太阳人可能不希望我们使用它们。

顺便说一下,继承至少有两个优点:代码共享和清晰的Javadoc。因为如果从类继承,则可以在Javadoc中看到所有子类。您也可以使用界面执行此操作,但之后您无法共享代码。更重要的是,你需要创建“嵌套”对象并调用两个或更多对象的构造函数而不是只有一个,这又意味着你要从超类Object本身实现一些开销!因为Java中没有对象而没有开销,并且创建尽可能少的对象对于高性能应用程序非常重要。对象是最棒的东西,但是不必要的对象不是......