32

Java线程本身实现了一个 Java Runnable!根据互联网上的大多数专家的说法,实现 Runnable 优于 extends Thread!即使我们不能在没有Thread 类的情况下使用线程意义上的利用 Runnable !
那么为什么我们更喜欢实现Runnable过度扩展,Thread因为在这两种情况下,实际线程都是通过调用Thread实现的方法(即start()run())来声明的,尽管如果Thread我们不是Thread通过仅仅覆盖run()方法来真正“扩展”功能呢?

如果我听起来令人困惑,我很抱歉..!

4

5 回答 5

77

最常见的区别是:

当你扩展 Thread 类时,你不能扩展你需要的任何其他类。(如您所知,Java 不允许继承多个类)。当您实现 Runnable 时,您可以为您的类节省空间,以便将来或现在扩展任何其他类。

然而,显着的区别是。

当您扩展 Thread 类时,您的每个线程都会创建唯一的对象并与之关联。当您实现 Runnable 时,它​​会将同一个对象共享给多个线程。

检查这个: http: //manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/

于 2013-03-18T07:15:01.847 回答
8

如果您的类正在扩展 Thread 类,那么它将成为一个继承属性Thread 类的单线程,所以它会很重。(在扩展 Thread 类时,每个线程都会创建唯一的对象并与之关联,但在实现 Runnable时,它​​会将同一个对象共享给多个线程)。

如果您的类正在实现 Runnable 接口,那么您只覆盖run(). 所以这个实例创建一个单独的Thread并且每个单独的线程单独运行,但不是作为程序中的单个重线程。还有一点,由于Java不支持多重继承,如果你实现了 Runnable 就可以避免多重扩展的问题,所以如果你实现了Runnable 接口,你可以扩展除Thread类之外的任何你需要的类。

于 2013-03-18T07:16:16.707 回答
5

一个类可能只有一个超类,但可以实现任意数量的接口。通过扩展,Thread您放弃了对其他任何事物进行子类化的机会。

于 2013-03-18T07:14:30.983 回答
3

Java 只允许单继承,这意味着如果你继承自Thread你将无法从任何其他类继承。实现Runnable接口没有这个限制,因为你的类可以实现任意数量的接口。

于 2013-03-18T07:15:18.720 回答
-5

你真的听起来很困惑。无论如何,我知道我们可以使用 Runnable 实现相同功能的原因之一,所以我们应该这样做,因为如果我们将实现 Runnable,那么我们可以扩展其他类,如果我们将扩展 Thread 类,这是不可能的

于 2013-03-18T07:23:02.260 回答