我试图了解来自 Java 背景的 Scala future :我知道你可以写:

val f = Future {   ...    }

那么我有两个问题:
  • 这个 future 如何安排?自动地?
  • 它将使用什么调度程序?在 Java 中,您将使用一个可以是线程池等的执行器。

  • 此外,如何实现 scheduledFuture ,即在特定时间延迟后执行的那个?谢谢

    最佳答案

    Future { ... } 块是调用 Future.apply(因为我相信你知道 Maciej)的语法糖,将代码块作为第一个参数传递。

    查看 docs for this method ,您可以看到它采用隐式 ExecutionContext - 正是这个上下文决定了它将如何执行。因此,要回答您的第二个问题, future 将由隐式范围内的任何 ExecutionContext 执行(当然,如果这不明确,则是编译时错误)。

    在许多情况下,这将是 import ExecutionContext.Implicits.global 中的一个,可以通过系统属性进行调整,但默认情况下使用 ThreadPoolExecutor,每个处理器内核一个线程。

    然而,调度是另一回事。对于某些用例,您可以提供自己的 ExecutionContext,它始终在执行前应用相同的延迟。但是,如果您希望从调用站点控制延迟,那么您当然不能使用 Future.apply,因为没有参数来传达应该如何安排它。在这种情况下,我建议将任务直接提交给预定的执行者。

    关于Scala - future 和并发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16357596/

    10-16 20:04