我正在阅读Java中的多线程编程。在java书中,它说任务与线程分离是一种首选设计。我不知道这意味着什么。
据我所知,最好使用implements Runnable而不是扩展Threads。我只是不明白为什么会这样。
为什么实施更好然后扩展?你何时会使用延伸?
答案 0 :(得分:4)
软件设计中的一个重要原则是关注点的分离:每个模块/对象/类/方法应该只有一个明确的责任。
Thread类混合了两个问题:
指定要执行的一系列步骤(Runnable)
与运行时系统交互以管理如何实现该序列的执行(在这种情况下通过专用的CPU线程)
应用程序员不应该关心第二部分:她应该只需要记下她想要执行的代码路径,即实现Runnable。
然后可以通过多种方式执行Runnable,例如通过启动新的Thread,还可以将其提供给ExecutionService。当您将runnable硬编码为Thread时,这种灵活性就会消失。
答案 1 :(得分:3)
Runnable
的优点是您可以将Runnable
传递给Thread
构造函数以外的其他内容。例如,您可以将它们与新的并发框架结合使用。
您可以扩展Thread
的一个原因是,您的任务需要直接访问正在运行的Thread
对象。
答案 2 :(得分:0)
逻辑上,IS-A关系不应该涉及组合的概念。
因此,当您想要创建自定义线程时,扩展线程类是“有用的”,所有超级方法的好处或覆盖某些方法=>对于Thread类,在这种情况下,对于大多数情况来说它肯定是无用的。
此外,扩展Thread会阻止您扩展所需的业务类,而使用接口,您仍然可以从所需的类扩展。
我们总是想知道新班级是否需要概念或是概念。
你需要Thread for Business类,所以很可能将它与所有Threading notion =>分开。所以Runnable足以掩盖它。