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
的功能?
如果我听起来很混乱,我道歉......!
答案 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那么我们可以扩展其他类,如果我们将扩展它们是不可能的线程类