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

     2023-02-16     14

关键词:

【中文标题】为啥“实现可运行”优于“扩展线程”? [复制]【英文标题】: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的回答中,我们可以读... 查看详情