关于java:可调用线程与可运行线程与扩展线程

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 RunnableExtending thread创建线程的方法。在第一个方法中(在我发现的教程中),我们需要调用Thread类,它需要Runnable实例来启动线程。但是,我找不到与Callable类似的东西,因为没有线程构造函数接受CallableExecutor frameworkFuture Task用于运行这些线程。那么,为什么我们说这两种方法都是相同的(除了可调用的重试和可以抛出异常)。

最后,正在写

1
2
Thread t = new Thread();
Thread t1 = new Thread(new RunnableInstance());

这些会在系统中创建新线程吗?有没有其他方法可以使用Runnable创建新线程而不将其作为构造函数传递给Thread类?

这不应该是重复的问题。


这是什么意思?它是否创建新线程?

可调用和可运行都只是接口,它们本身并不创建任何线程。相反,它们为开发人员提供API和抽象。当您想要在单独的线程中执行一些代码时,您通常实现可运行的,然后您可以决定如何执行它。它还没有绑定到任何线程。实际上,您有许多选择:

  • 在新线程中执行它
  • 用一些ExecutorService执行它
  • 或者直接打电话

如果是,为什么我们需要将实现可运行的类传递给线程构造函数?

不。因为runnable不在后面创建线程(好吧,因为它只是一个接口,所以根本不能!),我们需要显式执行这个可运行的。

这些会在系统中创建新线程吗?

对。

有没有其他方法可以使用runnable创建新的线程而不将其作为构造函数传递给线程类?

对。我提到了遗嘱执行人服务。您可以从线程池或完成服务中获益,查看API和示例。


CallableRunnable为其他类提供接口,以便在线程中执行它们。它们本身不包含任何功能。最常见的方法是通过ExecutorService来实现。看看java.until.concurrent中可用的类。有很多选择。除非您真的打算添加新的低级线程功能,否则扩展Thread并不是真正需要的。


可赎回的

它将返回执行的结果。

可运行的

它不会回来。但它会像Callable一样单独运行。

扩展线程

它也是一个可运行的。但是如果扩展线程,则不能扩展任何类,因为Java不支持多重继承。