关键词:
【中文标题】为啥“实现可运行”优于“扩展线程”? [复制]【英文标题】: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,那么我们可以扩展其他类,如果我们要扩展,这是不可能的线程类
【讨论】:
为啥模板构造函数优于复制构造函数?
】为啥模板构造函数优于复制构造函数?【英文标题】:Whyistemplateconstructorpreferredtocopyconstructor?为什么模板构造函数优于复制构造函数?【发布时间】:2020-01-1412:30:15【问题描述】:#include<iostream>structuctuct()std::cerr<<"defa... 查看详情
为啥 InvokeRequired 优于 WindowsFormsSynchronizationContext?
】为啥InvokeRequired优于WindowsFormsSynchronizationContext?【英文标题】:WhyisInvokeRequiredpreferredoverWindowsFormsSynchronizationContext?为什么InvokeRequired优于WindowsFormsSynchronizationContext?【发布时间】:2011-07-1121:18:45【问题描述】:任何时候初学 查看详情
为啥 tinyALSA 优于 libasound?
】为啥tinyALSA优于libasound?【英文标题】:WhyistinyALSApreferredoverlibasound?为什么tinyALSA优于libasound?【发布时间】:2014-07-0318:30:48【问题描述】:在最新的Android版本中,AOSP版本通常附带tinyALSA和tinyCompress。在thisquestion中,Simon提到... 查看详情
为啥转换构造函数优于转换运算符?
】为啥转换构造函数优于转换运算符?【英文标题】:Whyistheconvertingconstructorpreferredtotheconversionoperator?为什么转换构造函数优于转换运算符?【发布时间】:2021-12-0419:38:15【问题描述】:我有这个类SmallInt,它应该表示0-255-inclusiv... 查看详情
为啥 AJAX 优于 iFrame?
】为啥AJAX优于iFrame?【英文标题】:WhyAJAXoveriFrames?为什么AJAX优于iFrame?【发布时间】:2012-05-2606:51:07【问题描述】:我是一个相对较新的程序员,和他告诉我的一个伙伴交谈,在AJAX之前,他使用iframe发送数据和更改内容(显... 查看详情
为啥采用指针的函数优于采用数组引用的函数?
】为啥采用指针的函数优于采用数组引用的函数?【英文标题】:Whyisafunctiontakingapointerpreferredoverafunctiontakinganarrayreference?为什么采用指针的函数优于采用数组引用的函数?【发布时间】:2021-11-1903:18:30【问题描述】:考虑以下... 查看详情
为啥 Bootstrap 网格布局优于 HTML 表格?
】为啥Bootstrap网格布局优于HTML表格?【英文标题】:WhyistheBootstrapgridlayoutpreferabletoanHTMLtable?为什么Bootstrap网格布局优于HTML表格?【发布时间】:2013-01-0520:00:33【问题描述】:[注意:对于那些可能将此问题与“为什么不使用表格... 查看详情
为啥 DCT 变换在视频/图像压缩中优于其他变换
】为啥DCT变换在视频/图像压缩中优于其他变换【英文标题】:whyDCTtransformispreferredoverothertransformsinvideo/imagecompression为什么DCT变换在视频/图像压缩中优于其他变换【发布时间】:2013-04-1317:07:33【问题描述】:我了解了如何在图像... 查看详情
为啥 FusedLocationProviderApi 从不报告精度优于 10m?这有记录吗?
】为啥FusedLocationProviderApi从不报告精度优于10m?这有记录吗?【英文标题】:WhydoesFusedLocationProviderApineverreportaccuracybetterthan10m?Isthisdocumented?为什么FusedLocationProviderApi从不报告精度优于10m?这有记录吗?【发布时间】:2018-08-2315:49... 查看详情
为啥 Redis 的 SET 性能优于 GET?
】为啥Redis的SET性能优于GET?【英文标题】:WhyisRedisSETperformancebetterthanGET?为什么Redis的SET性能优于GET?【发布时间】:2013-01-1402:03:59【问题描述】:根据Redisbenchmarks,Redis每秒可以执行100\'000次SET操作,以及80\'000次GET操作/s。Redis... 查看详情
为啥在处理客户端请求时异步模式优于同步模式?
】为啥在处理客户端请求时异步模式优于同步模式?【英文标题】:WhyistheAsynchronousmodeisbetterthantheSynchronousonewhenhandlingclientsrequests?为什么在处理客户端请求时异步模式优于同步模式?【发布时间】:2010-07-0121:44:14【问题描述】:... 查看详情
扩展线程比实现 Runnable 更可取的场景? [复制]
】扩展线程比实现Runnable更可取的场景?[复制]【英文标题】:ScenariowhereextendingthreadispreferredthanimplementRunnable?[duplicate]【发布时间】:2014-04-2320:58:29【问题描述】:作为一个初学者,我正在阅读关于在Java中实现多线程的2种方法。... 查看详情
为啥 3 路合并优于 2 路合并?
】为啥3路合并优于2路合并?【英文标题】:Whyisa3-waymergeadvantageousovera2-waymerge?为什么3路合并优于2路合并?【发布时间】:2011-05-0622:55:58【问题描述】:Wikipedia表示3路合并比2路合并更不容易出错,而且通常不需要用户干预。为... 查看详情
为啥 ES2015 模块语法优于自定义 TypeScript 命名空间?
】为啥ES2015模块语法优于自定义TypeScript命名空间?【英文标题】:WhytheES2015modulesyntaxispreferredovercustomTypeScriptnamespaces?为什么ES2015模块语法优于自定义TypeScript命名空间?【发布时间】:2021-01-1013:43:52【问题描述】:来自typescript-es... 查看详情
在 Elixir 中,为啥在导入模块时“别名”优于“导入”?
】在Elixir中,为啥在导入模块时“别名”优于“导入”?【英文标题】:InElixir,whyis"alias"preferredover"import"forimportingthemodules?在Elixir中,为什么在导入模块时“别名”优于“导入”?【发布时间】:2022-01-0312:37:49【... 查看详情
通过扩展 Thread 类或实现 Runnable 来创建线程更可取的是啥? [复制]
】通过扩展Thread类或实现Runnable来创建线程更可取的是啥?[复制]【英文标题】:WhatismoreadvisabletocreateathreadbyextendingaThreadclassorimplementingRunnable?[duplicate]通过扩展Thread类或实现Runnable来创建线程更可取的是什么?[复制]【发布时间】... 查看详情
为啥 React 的性能优于使用 JQuery 的直接 DOM 操作?
】为啥React的性能优于使用JQuery的直接DOM操作?【英文标题】:WhyisthereasonofReact\'sbetterperformanceoverdirectDOMmanipulationusingJQuery?为什么React的性能优于使用JQuery的直接DOM操作?【发布时间】:2019-03-0410:28:46【问题描述】:我对DOM操作... 查看详情
为啥对于输出流,'\n' 优于 "\n"?
】为啥对于输出流,\\\'\\\\n\\\'优于"\\\\n"?【英文标题】:Whyis\'\\n\'preferredover"\\n"foroutputstreams?为什么对于输出流,\'\\n\'优于"\\n"?【发布时间】:2019-12-0600:42:32【问题描述】:在this的回答中,我们可以读... 查看详情