【问题标题】:What is the difference between Runnable and Future in Scala?Scala中的Runnable和Future有什么区别?
【发布时间】:2014-11-14 22:58:57
【问题描述】:

来自 Java 背景,我最近开始根据工作需要在 Scala 上进行编码。

我已经阅读了the concurrency guide for Scala 并且知道如何使用future 来执行异步任务。

我想知道:

  1. 如果我要执行的异步任务没有返回值,那么使用提交到线程的runnable和单独使用future有什么区别吗?

  2. future 与 runnable 相比表现如何?还是我在比较苹果和橙子?

【问题讨论】:

  • 苹果配橙色,是的。这两件事根本不能互换。
  • @Duncan 这正是发生在我身上的事。 :)
  • @Duncan 有道理:)

标签: multithreading scala


【解决方案1】:

Futurescala.concurrent.Future,不要与 Scalaz 中的那个混淆)是使用下面的 Runnable 实现的 - 请参阅 PromiseCompletingRunnable。在许多方面,它只是一个提供良好高级功能的包装器(特别是使用flatMap 的组合)。所以行为和性能非常相似 - Future 的性能将非常轻微低于“原始”Runnable,因为它涉及实例化更多的包装类,但这不太可能如果未来正在做任何实际工作(特别是如果运行它涉及创建一个新线程),那么在实践中会很明显。如果您创建一个Future[Unit] 并将其丢弃,这确实与创建一个Runnable 并将其提交给相同的ExecutionContext 非常相似。

【讨论】:

  • 我期待未来类似于 runnable。是否有任何未来使用可运行的参考状态?此外,如果它是一个包装好的 runnable,它是如何实现返回值的未来的?
  • 我没有任何参考,只是看标准库源码。值通过Promise 返回;当你创建一个Future 时,实际的实现是 1. 创建一个Promise 2. 创建一个PromiseCompletingRunnable 来执行你给它的计算,然后用它完成Promise 3. 提交PromiseCompletingRunnableExecutionContext 4. 返回Promise
【解决方案2】:

Future 是运行异步的东西的“容器”(它是一个 monad)。

所以,你得到了一个工具箱来处理计算结果/失败。

你读过这个:http://docs.scala-lang.org/overviews/core/futures.html 吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 2011-06-24
    • 2012-01-24
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多