实现Runnable与扩展Thread
这个问题在这里已经有了答案:
通过这种方式,您可以将计算( 即什么 )与执行( 何时和/或如何 ) 分开 。
通过Runnable
或Callable
,您可以将许多工作/计算提交给Executor
,以便安排这些工作。 这是ExecutorService的一个摘录表单:
pool = Executors.newFixedThreadPool(poolSize);
...
pool.execute(new Handler(serverSocket.accept()));
...
class Handler implements Runnable {
...
}
使用Runnable
/ Callable
为您提供更直接使用线程的灵活性。
实际的要点是,在任何有问题的情况下,贯彻始终优先于延伸。
Extends绑定两个类文件非常密切,并可能导致一些相当难处理代码。
当我第一次“理解”OO编程时,我一直在扩展所有事物,但它把我的整个设计变成了一团糟。 现在我只是扩展了几件明显而明显地通过了“is-a”测试的东西,其他所有东西都是一个接口。
许多问题刚刚停止(混淆多重继承情况,浪费重构层次结构,倾向于“保护”变量,然后想知道为什么当你在当前类中没有改变它们时,它们会改变,链接构造函数的需求,搞清楚不同的继承树如何相互影响,......
看起来每3年(过去20年),我认为我真的“获得”编程,并回顾3年前我所做的愚蠢事情......这是其中的一个例子(但接近7年在此之前)
因为IS-A真的不是你想要的。 你的班级希望成为Runnable,但IS-A Thread感觉太强大了。 这就是继承所说的。 你真的只想实现run()方法,而不是Thread类中的所有其他关注点。
这符合Scott Meyers在“更高效的C ++”中的非常好的建议:使非叶类抽象化。 替代接口,你就会发现。
链接地址: http://www.djcxy.com/p/92063.html