为什么“实现Runnable”优先于“extends Thread”?

时间:2013-03-18 07:10:07

标签: java multithreading runnable

Java Thread本身实现了Java Runnable!并且据大多数互联网专家称,implements Runnable is preferred over extends Thread!即使线程意义上的we cannot use utilize Runnable没有Thread类! 那么为什么我们更倾向于实现Runnable而不是Thread,因为在这两种情况下,通过调用Thread实现的方法(即start()或{{1}来说明实际线程。 })虽然在run()的情况下,我们并不仅仅通过覆盖Thread方法来“扩展”Thread的功能?

如果我听起来很混乱,我道歉......!

5 个答案:

答案 0 :(得分:64)

最常见的区别是:

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

然而,显着的区别是。

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

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

答案 1 :(得分:6)

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

如果您的类是实现Runnable接口,那么您只覆盖run()。因此,此实例创建一个单独的Thread,并且每个单独的线程单独运行但不作为程序中单个重线程。 另一件事,由于Java不支持多重继承,如果你实现Runnable ,你将避免多次扩展的问题,所以如果你实现 Runnable接口您可以扩展除 Thread 类之外所需的任何类。

答案 2 :(得分:4)

一个类可能只有一个超类,但可以实现任意数量的接口。通过扩展Thread,您可以放弃继承其他任何内容的机会。

答案 3 :(得分:1)

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

答案 4 :(得分:-2)

你真的很混淆。但是我知道的一个原因是我们可以使用Runnable实现相同的功能,所以我们应该去实现它,因为如果我们将实现Runnable那么我们可以扩展其他类,如果我们将扩展它们是不可能的线程类