Why does 'extends Thread' exist, when 'implements Runnable' is winner in all cases
我知道,在Java线程中,EDCOX1的0以上是优于EDCOX1(1)的,因为它允许我们在需要时扩展一些其他类。但如果是这样的话,extends Thread是否也比implements Runnable有自己的优势?如果是,这些优势是什么?
- @Proudand荣誉:是的,我读了这个问题的答案,但是所有的答案都解释了"实现可运行"是如何好的。事实上,这些答案在我的脑海中产生了这个问题。
- @Proudandhonource你介意链接到回答这个问题的答案吗?这在前几年似乎不太可能。
- 考虑场景,当线程启动时,您希望将特定线程的详细信息添加到DB。这与您在run()方法中使用的业务逻辑不同,因此您希望将其分开。因此,您将重写start()和run()方法
因为有时(几乎从来没有,但有时)你想改变EDOCX1的基本行为。
那是你需要延长的时候。
您可以通过重写Thread类中的方法来更改它,而不能通过实现Runnable类中的方法来更改它。
- 示例-asker想知道哪个线程创建/启动了这个线程。重写constructor和start以执行此操作。
自从Java 1发布以来的最后20年中,被认为是一个好的设计模式已经发生了变化。然而,Java致力于向后兼容性,这意味着旧代码可能会使用较差的设计模式仍然有效。
我最讨厌的一个是StringBuffer,因为它从来都不是一个好主意,使它的方法同步,被替换了几十年前,但不幸的是,开发人员并没有阻止使用它今天,甚至新的开发人员使用它,即使它被蔑视很久以前,他们开始使用Java。
- 阻塞可运行文件和线程之间的选择与"设计模式"无关,这没有任何意义。这是两种不同的用例场景
- 设计模式是组合与继承。您想到的两个不同的用例是什么?子类Thread很少涉及覆盖除run()以外的任何内容。
- 你似乎认为Runnable与Thread有某种联系。但事实并非如此。完全。可运行的是阻塞的,可执行的算法和线程是异步的,独立的,在调用线程结束后仍然可以运行很长时间。请不要写关于你不熟悉的话题的答案,非常感谢。这个问题可以重新表述为"什么更好:转基因作物还是最后一个坏的季节?"---不计算。
- @你必须学习另一种语言。我在谈论Java和Java,线程的代码的第一行是EDCOX1(5),这意味着通过继承,可以在使用Runnabl的任何地方传递一个重写线程,并且可以在线程的构造函数中传递一个Runnabl作为它的默认实现。如果有人对你没有意义,那可能只是意味着你不明白他们在说什么。这个问题确实有意义,因为它是一个常见的问题,请参阅"可能的重复"
- 类签名是兼容的这一事实并没有改变这个问题和上述所有答案的无意义性——可运行文件仍然不是线程,它们永远不会自己异步运行。
- @专攻,所以你承认他们是有关联的,只有当他们问这个相当普遍的问题时,你选择不考虑OP意味着什么才是没有意义的。虽然你的第二句话是真的,但这不是OP所说的。
- 他们没有关系。完全。签名不是恒等式,这是基本逻辑——我可以编写一个与Integer兼容的类,但是我可以改变它的整个行为,这样如果我想的话,它就吐出一个浮点值——我会在equals内部遇到精度问题,但这就是它,有"好"的近似值。
- 没有专门的方法来为Java 1编写一个类和一个彼此更相关的接口。你对相关事物的衡量似乎不是很有用。方法有签名,但类和接口没有,所以您在这一点上失去了我。只有整数中的floatValue有一个浮点值,所以我看不出您指的是什么。我建议你考虑一下Java是如何实际使用的,而不是谈论可能对你有意义的理论。
- @专门在jls中提到类的签名在哪里?
- 不仅仅是我,谷歌不知道Java中的一个类签名意味着GooGeL.C.UK/WebHP。安全=放屁,q= java+类+签名
- 特别让我困惑的是,有人对Java有这么独特的看法。
- 好吧,我猜你是新的编程,所以这里没有什么:签名是输入/输出声明和类型的集合,在Java中,这些是最常用的修饰符,如"公共"(可见性修饰符)或"无效"(输入/输出声明)。类也有这些,它们只是缺少输入/输出部分…啊,就是这样。现在,我建议您做一些编程练习,您将很快发现许多在某些JLS中甚至没有提到的事情-因为它们是绝对基础的、基本的知识,甚至是纯逻辑应用的结果,所以您有很多要发现的。
- 我想用非正式的方式看你想说什么,但是在Java中这些词有特定的含义,如果你要和某人争论,最好用他们在语言中所赋予的意思。另外,如果你想和某个人争论,当你有很多东西要学的时候,最好知道你在和谁说话,因为虽然这是真的,我还有很多东西要学,但你似乎需要学习更多基本的东西,比如你争论的语言。