Callable Threads versus Runnable Threads versus Extend Thread
最近,我通过EDCOX1、0或EDCOX1、1和最后的EDCOX1×2来了解Java中线程的创建。stackoverflow的runnable和callable线程描述了引用both are designed for classes whose instances are potentially executed by another thread的差异。这是什么意思?它是否创建新线程?如果是,为什么我们需要将实现Runnable的类传递给Thread构造函数?
另外,我还看到了由implementing Runnable或Extending thread创建线程的方法。在第一个方法中(在我发现的教程中),我们需要调用Thread类,它需要Runnable实例来启动线程。但是,我找不到与Callable类似的东西,因为没有线程构造函数接受Callable。Executor framework或Future Task用于运行这些线程。那么,为什么我们说这两种方法都是相同的(除了可调用的重试和可以抛出异常)。
最后,正在写
这些会在系统中创建新线程吗?有没有其他方法可以使用Runnable创建新线程而不将其作为构造函数传递给Thread类?
这不应该是重复的问题。
- 执行器是在Java中创建线程的现代方法,其中开发人员对线程有更多的处理,并且它具有线程池。ExecutorService#submit您还提交了可运行实例。
- @Subrajyotimajumder谢谢回复。你也能回答所有其他的问题吗?你的评论只部分地回答了它。
这是什么意思?它是否创建新线程?
可调用和可运行都只是接口,它们本身并不创建任何线程。相反,它们为开发人员提供API和抽象。当您想要在单独的线程中执行一些代码时,您通常实现可运行的,然后您可以决定如何执行它。它还没有绑定到任何线程。实际上,您有许多选择:
- 在新线程中执行它
- 用一些ExecutorService执行它
- 或者直接打电话
如果是,为什么我们需要将实现可运行的类传递给线程构造函数?
不。因为runnable不在后面创建线程(好吧,因为它只是一个接口,所以根本不能!),我们需要显式执行这个可运行的。
这些会在系统中创建新线程吗?
对。
有没有其他方法可以使用runnable创建新的线程而不将其作为构造函数传递给线程类?
对。我提到了遗嘱执行人服务。您可以从线程池或完成服务中获益,查看API和示例。
- 因此,它意味着,我们可以使用任何方法来执行实现Runnable或Callable的类,而不是特定于我所写的问题。是真的吗?除了实现Callable的类不能在新线程中运行外。我说的对吗?
- @维韦克瓦尔丹:是的,这是真的,你是对的。
- 我又困惑了。如果Runnable只是一个不绑定到任何线程的接口,那么它的用途是什么?我们可以有任何接口,比如说IMyInterface,其中我将有run方法,那么实现这个接口的任何类都需要通过在新线程中执行它或使用executor服务来将它绑定到新线程。直接运行会在主线程下运行。这是正确的吗?
- 或者可能不是,因为线程没有接受IMyInterface作为参数的任何构造函数。但是,它接受Runnable,这就是我们需要实现Runnable的原因。
Callable和Runnable为其他类提供接口,以便在线程中执行它们。它们本身不包含任何功能。最常见的方法是通过ExecutorService来实现。看看java.until.concurrent中可用的类。有很多选择。除非您真的打算添加新的低级线程功能,否则扩展Thread并不是真正需要的。
可赎回的
它将返回执行的结果。
可运行的
它不会回来。但它会像Callable一样单独运行。
扩展线程
它也是一个可运行的。但是如果扩展线程,则不能扩展任何类,因为Java不支持多重继承。