扩展Thread类并实现Runnable接口的场景[重复]
Posted
技术标签:
【中文标题】扩展Thread类并实现Runnable接口的场景[重复]【英文标题】:Scenario of extending Thread class and implementing Runnable interface [duplicate] 【发布时间】:2012-02-15 23:09:12 【问题描述】:我是 Java 线程编程的新手,因此是这个基本问题。 (我查过,但找不到以前问过的这个问题)
我读到线程可以通过继承 Thread 类或实现 Runnable 接口来创建。 我看到了一个代码,它们都属于同一个类。
public class ThreadExample extends Thread implements Runnable
我想知道什么样的情况会想要这个,如果这样做有什么好处,它是什么。
【问题讨论】:
【参考方案1】:扩展Thread
和实现Runnable
是没用的(Thread
已经实现Runnable
)。你几乎总是想要实现Runnable
(并且不扩展Thread
)。这使您可以灵活地直接使用Thread
(不推荐)或使用java.util.concurrent
中较新的ThreadPool
实现之一(推荐)。
【讨论】:
【参考方案2】:不,使用这种方法没有任何优势,因为 Thread 类实现了 Runnable 接口。所以,如果你的类扩展了 Thread 类。这意味着,它也在实现 Runnable 接口。
【讨论】:
【参考方案3】:在这种特定情况下,它不是很有用,正如其他发帖人所解释的那样,很明显Thread
已经实现了Runnable
。
在某些情况下,“陈述显而易见”可能很有用,就像对类用户的“提醒”:如果您有相当大的超类和接口层次结构,具有多个继承级别(其中一些在 3rd-party 库中),它可以作为帮助器将类声明为实现特定接口,即使它根据定义实现它,因为它超类已经实现了它或实现了该接口的子类之一。
标记接口特别有用(有些人可能会反对它们根本不应该使用,它们是不好的做法 - 有时你不能完全控制环境),即与没有实际的实现,只是设计来标记您的对象符合特殊功能(例如Cloneable
)。在这种情况下,标记每个允许的类,即使它们的父类已经符合条件也可以更明确,因此更有用。
【讨论】:
【参考方案4】:Runnable 接口意味着将一个作业分配给多个线程 而 Thread 类,每个线程都有一个与之关联的唯一对象。
【讨论】:
这根本不是正确的 在尝试回答更多问题之前,请阅读How do I write a good answer?。【参考方案5】:当您需要更灵活地扩展其他基类时,最好实现可运行接口。
【讨论】:
在尝试回答更多问题之前,请阅读How do I write a good answer?。 我已经读过了。请告诉我 - 我的答案有什么问题?以上是关于扩展Thread类并实现Runnable接口的场景[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Thread使用总结——Runnable和Thread的区别是啥