为啥“实现可运行”优于“扩展线程”? [复制]
Posted
技术标签:
【中文标题】为啥“实现可运行”优于“扩展线程”? [复制]【英文标题】:Why "implements Runnable" is Preferred over "extends Thread"? [duplicate]为什么“实现可运行”优于“扩展线程”? [复制] 【发布时间】:2013-03-06 11:18:31 【问题描述】:Java Thread 本身实现了 Java Runnable
!根据互联网上大多数专家的说法,implements Runnable is preferred over extends Thread!即使 we cannot use utilize Runnable 在没有 Thread 类的线程意义上!
那么为什么我们更喜欢实现Runnable
而不是扩展Thread
,因为在这两种情况下,实际线程都是通过调用Thread
实现的方法(即start()
或run()
)来声明的,尽管在Thread
的情况下,我们仅仅通过覆盖run()
方法并没有真正“扩展”Thread
的功能吗?
如果我听起来令人困惑,我深表歉意..!
【问题讨论】:
线程很难控制。查看执行者以查看更好的方法。它们采用可调用对象和可运行对象,而不是线程。 【参考方案1】:一个类可能只有一个超类,但可以实现任意数量的接口。通过扩展Thread
,您放弃了继承任何其他内容的机会。
【讨论】:
【参考方案2】:最常见的区别是:
当你扩展 Thread 类时,你不能扩展你需要的任何其他类。 (如您所知,Java 不允许继承多个类)。当您实现 Runnable 时,您可以为您的类节省空间,以便将来或现在扩展任何其他类。
然而,显着的区别是。
当您扩展 Thread 类时,您的每个线程都会创建唯一的对象并与之关联。当您实现 Runnable 时,它会将同一个对象共享给多个线程。
检查这个: http://manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/
【讨论】:
表示如果,特定于应用程序,将来或现在,我们不需要继承已经继承的类(继承自Thread)并且应用程序似乎没有面对内存问题,然后是 Runnable 和 Thread,两者应该有平等的机会..? 一个OOP,基本原则是,“总是编程到接口而不是实现” 对链接的解释表示肯定,感谢您在此处发布 链接中提供的示例清除了 Thread extend 和 Runnable 之间的差异概念。谢谢!【参考方案3】:Java 只允许单继承,这意味着如果您从Thread
继承,您将无法从任何其他类继承。实现Runnable
接口没有这个限制,因为您的类可以实现任意数量的接口。
【讨论】:
【参考方案4】:如果你的类扩展了 Thread 类,那么它就变成了一个继承属性 Thread 类的单线程,所以它会很重。 (当扩展 Thread 类每个线程创建唯一的对象并与之关联,但是当实现 Runnable 时,它将同一个对象共享给多个线程)。
如果您的类是实现 Runnable 接口,那么您只需覆盖 run()
。因此,此实例创建一个单独的 Thread
并且每个单独的线程单独运行,但不是作为单个重线程你的程序。
还有一点,由于Java
不支持多重继承,如果你实现Runnable就可以避免多重扩展的问题,所以如果你实现Runnable接口 除了 Thread 类之外,你可以扩展任何你需要的类。
【讨论】:
内存消耗怎么样,...会不会是runnable的执行和new Thread()语句其实是一样的? (如果一次调用多个电话会很贵)?【参考方案5】:你听起来真的很困惑。无论如何,我知道我们可以使用 Runnable 实现相同功能的原因之一,所以我们应该这样做,因为如果我们要实现 Runnable,那么我们可以扩展其他类,如果我们要扩展,这是不可能的线程类
【讨论】:
以上是关于为啥“实现可运行”优于“扩展线程”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
当我执行多个优于 Runtime.getRuntime().availableProcessors()) 的并行线程时,为啥我的 Java 程序运行得更快?
为啥 InvokeRequired 优于 WindowsFormsSynchronizationContext?