为啥存在“扩展线程”,当“实现可运行”在所有情况下都是赢家时[重复]

     2023-02-16     196

关键词:

【中文标题】为啥存在“扩展线程”,当“实现可运行”在所有情况下都是赢家时[重复]【英文标题】:Why does 'extends Thread' exist, when 'implements Runnable' is winner in all cases [duplicate]为什么存在“扩展线程”,当“实现可运行”在所有情况下都是赢家时[重复] 【发布时间】:2016-04-28 23:39:54 【问题描述】:

我知道implements Runnable is preferred over extends Thread 在 Java 线程中,因为它允许我们在需要时扩展其他一些类。但如果是这样的话,extends Thread 是否也比implements Runnable 有自己的优势,如果有,这些优势是什么?

【问题讨论】:

@proudandhonour :是的,我阅读了该问题的答案,但所有答案都在解释“实现可运行”的好处。实际上,这些答案在我脑海中产生了这个问题。 @proudandhonour 你介意链接到回答这个问题的答案吗?前几个似乎没有。 考虑场景,当线程启动时,您希望将该特定线程的详细信息添加到数据库。这与您在 run() 方法中的业务逻辑不同,因此您希望将其分开。因此,您将覆盖 start() 和 run() 方法 【参考方案1】:

因为有时(几乎从不,但有时)您希望能够更改Thread 的基本行为。

这时你需要扩展它。

您可以通过覆盖 Thread 类中的方法来更改它,但您无法通过实现 Runnable 中的方法来做到这一点。

【讨论】:

示例here - 询问者想知道哪个线程创建/启动了这个线程。覆盖构造函数和start 这样做。【参考方案2】:

自 Java 1.0 发布以来的过去 20 多年里,被认为是好的设计模式已经发生了变化。但是,Java 致力于向后兼容,这意味着可能使用不良设计模式的旧代码仍然可以工作。

我最讨厌的一个是StringBuffer,让它的方法同步从来都不是一个好主意,十多年前就被替换了,但不幸的是,今天并没有阻止开发人员使用它,甚至新开发人员也使用它,尽管在他们开始使用 Java 之前很久就被弃用了。

【讨论】:

阻塞runnables和线程之间的选择与“设计模式”无关,这没有任何意义。这是两个不同的用例场景 设计模式是组合与继承。您想到的两个不同的用例是什么。子类化Thread很少关于覆盖除run() 之外的任何内容 您似乎认为RunnableThread 有某种关联。那么它不是。完全没有。 Runnables 是阻塞的,可执行算法和线程是异步的,独立的,在调用线程结束后仍然可以运行很长时间。请不要写与您无关的话题的答案,非常感谢。这个问题可以重新表述为“哪个更好:转基因作物还是上一季坏掉?” --- 不计算。 @specializt 你一定在学习另一种语言。我说的是 Java,在 Java 中,Thread 的第一行代码是 class Thread implements Runnable 这意味着通过继承,您可以在使用 Runnable 的任何地方传递重写的 Thread,并且可以在 Thread 的构造函数中传递 Runnable成为它的默认实现。如果某个人对你来说没有意义,那可能只是意味着你不明白他们在说什么。这个问题确实有道理,因为这是一个常见问题,请参阅“可能重复” 类签名兼容的事实并没有改变这个问题和所有上述答案的无意义 - 可运行对象仍然不是线程,它们永远不会自行异步运行

为啥在这种情况下星号位置存在差异,而其他情况则没有?

】为啥在这种情况下星号位置存在差异,而其他情况则没有?【英文标题】:Whyisthereadifferenceinasterisklocationinthiscase,butnotothers?为什么在这种情况下星号位置存在差异,而其他情况则没有?【发布时间】:2019-04-0721:32:28【问题描述... 查看详情

当背景色存在时,为啥“位置:粘性”边框不可见?

】当背景色存在时,为啥“位置:粘性”边框不可见?【英文标题】:Whyborderisnotvisiblewith"position:sticky"whenbackground-colorexists?当背景色存在时,为什么“位置:粘性”边框不可见?【发布时间】:2017-01-2620:41:34【问题描述... 查看详情

为啥当我在选中 CheckBox 的情况下滚动 ListView 时,它会变为未选中状态?

】为啥当我在选中CheckBox的情况下滚动ListView时,它会变为未选中状态?【英文标题】:WhyWhenIscrollmyListViewwithCheckBoxselecteditbecomesunselected?为什么当我在选中CheckBox的情况下滚动ListView时,它会变为未选中状态?【发布时间】:2015-0... 查看详情

为啥我不能在没有访问所有其他数据库的情况下导入数据层应用程序?

】为啥我不能在没有访问所有其他数据库的情况下导入数据层应用程序?【英文标题】:WhycanInotimportdata-tierapplicationwithoutaccesstoallotherdatabses?为什么我不能在没有访问所有其他数据库的情况下导入数据层应用程序?【发布时间】... 查看详情

当我们实际上可以在不使用装饰器的情况下注入服务时,为啥要使用 @Injectable() 装饰器?

...当我们实际上可以在不使用装饰器的情况下注入服务时,为啥要使用@Injectable()装饰器?【英文标题】:Whydoweuse@Injectable()decorator,whenwecanactuallyinjectserviceswithoutusingthedecoratoraswell?当我们实际上可以在不使用装饰器的情况下注入服务... 查看详情

为啥向量总是比 C 数组慢,至少在这种情况下?

】为啥向量总是比C数组慢,至少在这种情况下?【英文标题】:whyvectorisalwaysslowerthanCarray,atleastinthiscase?为什么向量总是比C数组慢,至少在这种情况下?【发布时间】:2015-06-1023:43:19【问题描述】:我正在尝试使用Eratosthenes\'Siev... 查看详情

为啥默认情况下所有函数都不应该是异步的?

】为啥默认情况下所有函数都不应该是异步的?【英文标题】:Whyshouldn\'tallfunctionsbeasyncbydefault?为什么默认情况下所有函数都不应该是异步的?【发布时间】:2013-09-0104:16:52【问题描述】:.net4.5的async-await模式正在改变范式。好... 查看详情

如何在不查询所有集合的情况下检查我的用户中是不是存在字段[重复]

】如何在不查询所有集合的情况下检查我的用户中是不是存在字段[重复]【英文标题】:Howtocheckifafieldexsitsinsidemyuserswithoutqueryingallthecollection[duplicate]如何在不查询所有集合的情况下检查我的用户中是否存在字段[重复]【发布时间... 查看详情

为啥在 JavaScript 中显示数组元素的上限为 100,有没有办法在没有循环或 splice() 的情况下显示所有内容? [复制]

】为啥在JavaScript中显示数组元素的上限为100,有没有办法在没有循环或splice()的情况下显示所有内容?[复制]【英文标题】:Whydisplayingarrayelementscappedat100inJavaScriptandisthereawaytodisplayeverythingwithoutalooporsplice()?[duplicate]为什么在JavaScri... 查看详情

hdfs 中的权限组(默认情况下)如何工作?为啥所有用户文件都属于超级组?

】hdfs中的权限组(默认情况下)如何工作?为啥所有用户文件都属于超级组?【英文标题】:Howpermissiongroups(bydefault)inhdfswork??Whyallusersfilesbelongtosupergroup?hdfs中的权限组(默认情况下)如何工作?为什么所有用户文件都属于超级... 查看详情

为啥 HttpClient 似乎在没有 .Result 的情况下挂起? [复制]

】为啥HttpClient似乎在没有.Result的情况下挂起?[复制]【英文标题】:WhydoesHttpClientappeartohangwithout.Result?[duplicate]为什么HttpClient似乎在没有.Result的情况下挂起?[复制]【发布时间】:2019-05-3112:30:39【问题描述】:我有这段代码来调... 查看详情

为啥默认情况下不需要 mongoose 中的所有字段?

】为啥默认情况下不需要mongoose中的所有字段?【英文标题】:Whybydefaultallfieldsinmongoosearenotrequired?为什么默认情况下不需要mongoose中的所有字段?【发布时间】:2014-02-2518:32:17【问题描述】:好像mongooseschema中每个字段的required属... 查看详情

为啥我可以在不使用 std::getline 的情况下调用 getline?

】为啥我可以在不使用std::getline的情况下调用getline?【英文标题】:WhycanIcallgetlinewithoutusingstd::getline?为什么我可以在不使用std::getline的情况下调用getline?【发布时间】:2015-10-1410:16:54【问题描述】:我正在关注C++Primer书籍并尝... 查看详情

为啥当我在编辑器中按下播放时 Unity 会崩溃?

】为啥当我在编辑器中按下播放时Unity会崩溃?【英文标题】:WhyisUnitycrashingwhenIpressplayintheeditor?为什么当我在编辑器中按下播放时Unity会崩溃?【发布时间】:2015-01-2900:31:48【问题描述】:每当我切换场景然后在编辑器中按播放... 查看详情

为啥 NSThread 可以在不创建我自己的 autoreleasepool 的情况下清除自动释放的对象

】为啥NSThread可以在不创建我自己的autoreleasepool的情况下清除自动释放的对象【英文标题】:whyNSThreadcanclearautoreleasedobjectswithoutcreatingmyownautoreleasepoool为什么NSThread可以在不创建我自己的autoreleasepool的情况下清除自动释放的对象【... 查看详情

在可能存在多个选项的情况下,如何创建策略以强制标记?

】在可能存在多个选项的情况下,如何创建策略以强制标记?【英文标题】:HowcanaPolicybecreatedtoEnforceTaggingwhereseveraloptionsmayexist?【发布时间】:2019-04-1410:12:24【问题描述】:我正在尝试创建一个强制创建标记的Azure策略。示例;... 查看详情

为啥我可以在未经许可的情况下删除/列出 S3 存储桶中的对象

】为啥我可以在未经许可的情况下删除/列出S3存储桶中的对象【英文标题】:whyamIabletodelete/listobjectsinaS3Bucketwithoutpermission为什么我可以在未经许可的情况下删除/列出S3存储桶中的对象【发布时间】:2022-01-0203:23:38【问题描述】... 查看详情

为啥在这种情况下需要 catch IOException

】为啥在这种情况下需要catchIOException【英文标题】:WhyiscatchIOExceptionneededinthissituation为什么在这种情况下需要catchIOException【发布时间】:2019-03-2715:47:19【问题描述】:我看到了这个使用FileInuputStream和FileOutputStream的例子:try(File... 查看详情