为啥“实现可运行”优于“扩展线程”? [复制]

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?

为啥大多数 C 开发人员使用 define 而不是 const? [复制]

为啥 tinyALSA 优于 libasound?

为啥采用指针的函数优于采用数组引用的函数?

为啥 AJAX 优于 iFrame?