【问题标题】:Callable Threads versus Runnable Threads versus Extend Thread可调用线程与可运行线程与扩展线程
【发布时间】:2014-10-12 12:54:48
【问题描述】:

我最近阅读了implementing Runnable 或Extending thread 和最后Implementing Callable 在java 中创建线程的信息。 stackoverflow 上的Runnable Versus 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 用于运行这些线程。那为什么我们说两种方式都是一样的(除了 Callable 会重新运行一些东西并且可以抛出异常)。

最后,正在写

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

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

这不应该是重复的问题。

【问题讨论】:

  • Executors 是在 Java 中创建线程的现代方式,其中开发人员对线程有更多的处理并且它有线程池。 ExecutorService#submit 你也提交了可运行的实例。
  • @SubhrajyotiMajumder 感谢您的回复。你能回答所有其他的问题吗?您的评论只是部分回答了它。

标签: java multithreading runnable callable


【解决方案1】:

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

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

  • 在新线程中执行
  • 使用一些 ExecutorService 执行它
  • 或者直接调用它

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

没有。 由于 Runnable 不会在后面创建线程(嗯,它只是一个接口,所以它根本不能!),我们需要显式地执行这个 Runnable。

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

是的。

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

是的。我已经提到了 ExecutorService。你可以从线程池或完成服务中获利,看看API和examples。

【讨论】:

  • SO,这意味着,我们可以使用任何方法执行实现Runnable 或Callable 的类,而不是特定于我所写的问题。这是真的吗?除了实现Callable的类不能在新线程中运行。我说的对吗?
  • 我又糊涂了。如果Runnable只是一个没有绑定任何线程的接口,那它有什么用呢?我们可以有任何接口说IMyInterface,其中我将有run 方法,然后任何实现此接口的类都需要通过在新线程中执行它或使用执行器服务执行它来将其绑定到新线程。直接运行会在主线程下运行。对吗?
  • 或者可能不是,因为 Thread 没有任何接受 IMyInterface 作为参数的构造函数。但是,它接受Runnable,这就是为什么我们需要实现Runnable
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    可调用

    它会返回执行的结果。

    可运行

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

    扩展线程

    它也是一个runnable。但是如果你扩展 thread ,你不能扩展任何类,因为 java 不支持多重继承。

    【讨论】:

    • 教程中也有这些。我有一些更具体的问题
    猜你喜欢
    • 2014-12-18
    • 2014-03-19
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2011-10-16
    • 2011-07-30
    相关资源
    最近更新 更多