Java多线程编程

Java多线程编程,java,multithreading,interface,superclass,Java,Multithreading,Interface,Superclass,用Java语言创建线程有两种方法,一种是通过实现“Runnable”,另一种是通过扩展“thread”类。在我正在读的书(Herbert Schildt)中,有人写道实现“Runnable”接口更好,他们已经适当地提供了原因,但我无法理解。有人能解释一下为什么java中有两种创建线程的方法,以及为什么实现接口是更好的解决方案吗?使用Runnable更好,特别是考虑到java支持匿名临时类。从线程继承很麻烦 这本书有点过时了。还有第三种方法:使用Callable。它允许您指定异常并具有返回类型 简

用Java语言创建线程有两种方法,一种是通过实现“Runnable”,另一种是通过扩展“thread”类。在我正在读的书(Herbert Schildt)中,有人写道实现“Runnable”接口更好,他们已经适当地提供了原因,但我无法理解。有人能解释一下为什么java中有两种创建线程的方法,以及为什么实现接口是更好的解决方案吗?

使用
Runnable
更好,特别是考虑到java支持匿名临时类。从
线程继承
很麻烦

这本书有点过时了。还有第三种方法:使用
Callable
。它允许您指定异常并具有返回类型


简单地说,您向执行者提交一个
可调用的
,执行者将返回一个
未来
。然后,您可以使用该未来来检查线程的返回值。

实现Runnable允许更松散的耦合,这是一种很好的设计模式。相关的(如果不是dup):

实现接口与扩展相比是一个很好的实践。您可以实现任意数量的接口,并且只能扩展一个类。这就是总结。

您应该使用它来实现Runnable,因为它在软件设计的意义上更好

例如,您可以为所有Runnable创建abstrace BaseImplementation。如果从线程继承,则无法执行该操作

但这本书似乎是Java5之前的一本书。使用Java5,您将有一个更新的可调用接口。此接口指定返回值。在新的执行器中,启动线程和线程池变得更加容易。您应该更喜欢实现Callables


我们可以实现这么多类,但只能扩展1个。如果您扩展Thread类,那么您将阻止并无法扩展任何其他类。Runnable is接口将由Thread类实现,这是使用
Runnable
(和
Callable
)的一个很好的理由另外,它们还可以在执行器中使用。从线程扩展还可以防止代码与任何类型的线程池一起使用。实现Runnable要灵活得多。