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