可调用线程与可运行线程与扩展线程

时间:2014-08-19 12:13:47

标签: java multithreading runnable callable

我最近在阅读implementing RunnableExtending thread以及最后Implementing Callable来创建java中的主题。 stackoverflow上的Runnable Versus Callable线程描述了引用both are designed for classes whose instances are potentially executed by another thread的差异。这是什么意思?它会创建新线程吗?如果是,为什么我们需要将实现Runnable的类传递给Thread构造函数?

另外,我看到了implementing RunnableExtending thread创建线程的方法。在第一种方法中,(在我找到的教程中),我们需要调用Thread类,它需要Runnable实例来启动线程。但是,我找不到Callable的类似内容,因为没有接受Callable的Thread构造函数。 Executor frameworkFuture Task用于运行这些线程。那么为什么我们说两种方式都是相同的(除了Callable重新实现某些东西并且可以抛出异常)。

最后,正在撰写

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

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

这不应该是一个重复的问题。

3 个答案:

答案 0 :(得分:3)

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

Callable和Runnable都只是接口,他们不会自己创建任何线程。相反,他们为开发人员提供API和抽象。当您想在单独的线程中执行某些代码时,通常会实现Runnable,然后您可以决定如何执行它。它还没有绑定任何线程。实际上你有很多选择:

  • 在新主题
  • 中执行
  • 使用一些ExecutorService执行它
  • 或直接直接致电

如果是,为什么我们需要将实现Runnable的类传递给Thread构造函数?

没有。 由于Runnable不会创建线程(好吧,它只是因为它只是一个接口!),我们需要明确地执行这个Runnable。

这些是否会在系统中创建新的线程?

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

是。我已经提到过ExecutorService。您可以从线程池或完成服务中获益,请查看APIexamples

答案 1 :(得分:1)

<强>可赎回

它将返回执行结果。

<强>可运行

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

延长线程

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

答案 2 :(得分:1)

CallableRunnable为其他类提供了在线程中执行它们的接口。它们不包含自己的功能。最常见的方法是通过ExecutorService。查看java.until.concurrent中可用的课程。那里有很多选择。除非您真的打算添加新的低级线程功能,否则不会实际扩展Thread