扩展Thread类和实现Runnable接口的场景

11

我刚开始学习Java的线程编程,有一个基础问题想问一下。(我查了一下,但并没有找到之前被问过这个问题)

我了解到可以通过继承Thread类或实现Runnable接口来创建线程。 我看到有一段代码在同一个类中同时使用了两种方式。

public class ThreadExample extends Thread implements Runnable {
}

我想知道什么样的情况下需要这样做,以及是否有任何优势,如果有的话是什么。

5个回答

12

扩展Thread并实现Runnable是无用的(Thread已经实现了Runnable)。你几乎总是希望实现Runnable(而不是扩展Thread)。这使您可以直接使用Thread(不建议使用),或者使用java.util.concurrent中的新版ThreadPool实现(推荐使用),从而具有更大的灵活性。


5
不,使用这种方法没有任何优势,因为Thread类实现了Runnable接口。所以,如果你的类扩展了Thread类,那么它也是在实现Runnable接口。

4
在这种特定情况下,它并不是很有用,正如其他帖子已经解释过的那样,很明显Thread已经实现了Runnable
在一些情况下,“陈述显而易见的事实”可能会有用,就像对您的类的用户进行“提醒”一样:如果您拥有一个相当大的超类和接口层次结构,具有多个继承级别(其中一些在第三方库中),则将类声明为实现特定接口可能会作为助手有用,即使它通过定义已经实现了该接口,因为其超类已经实现了该接口的子类之一。
它在标记接口上特别有用(有些人可能会反对它们根本不应该使用,并且它们是不好的做法-嗯,有时候您无法完全控制环境),即没有实际实现,只是设计用于标记对象适合特殊功能(例如Cloneable)。在这种情况下,即使它们的父级已经适合,标记每个允许的类可能更加明确,因此更有用。

-1

Runnable接口意味着将一个任务分配给多个线程,而Thread类则是每个线程都有一个唯一的关联对象。


这绝对不正确,甚至远非正确。 - user177800
在尝试回答更多问题之前,请阅读如何撰写好的答案? - user177800

-1
实现Runnable接口在需要更灵活地扩展其他基类时会更可取。

在尝试回答更多问题之前,请阅读如何撰写好的答案? - user177800
我已经阅读了那个。请告诉我,我的答案哪里有问题? - rashedcs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接