我无法像解释here那样创建未来。它表示您可以使用以下代码直接创建Future
:
import akka.dispatch.Await
import akka.dispatch.Future
import akka.util.duration._
val future = Future {
"Hello" + "World"
}
val result = Await.result(future, 1 second)
使用完全相同的代码,我收到错误消息,说:error: could not find implicit value for parameter executor: akka.dispatch.ExecutionContext
。我能找到关于ExecutionContext
的所有信息,你可以“用它来做”。在文档中,我发现的唯一一行是:
implicit val ec = ExecutionContect.fromExecutionService(yourExecutionServiceGoesHere)
但这对我没用。有人对我这个话题有什么建议吗?如何在不询问Future
的情况下创建新的Actor
?
答案 0 :(得分:7)
如果你有一个ActorSystem
,那么它将有一个ExecutionContext
,可以在这里使用。它必须是implicit
,除非您明确将其传递给Future.apply
方法。
出于演示的目的,如果您只是想在REPL中看到它是如何工作的:
implicit val system = ActorSystem("MySystem").dispatcher
(ActorSystem => ExecutionContext
对象上还有一个隐式转换ExecutionContext
。
要创建模块化代码,而不在使用点之前创建上下文,请考虑将上下文作为特征的抽象成员:
trait MyFutures {
implicit val context: ExecutionContext
def helloFuture: Future[String] = Future { "hello" + "world" }
}
答案 1 :(得分:3)
您的代码无法编译,因为您正在编写非法的Scala代码:Future.apply
的签名清楚地表明了这一点。我假设您了解您正在调用特征Future的伴随对象的apply方法,该方法如下:
object Future extends java.lang.Object with scala.ScalaObject {
def apply[T](body : => T)(implicit executor : akka.dispatch.ExecutionContext) : akka.dispatch.Future[T] = { /* compiled code */ }
}
由于在调用ExecutionContext
时没有可用的隐式Future.apply
,因此会出现编译错误。它与调用接收两个参数的方法相同,如果只提供一个参数。
如何创建ExecutionContext
的问题不同,您可以在Akka文档中找到答案:
为了执行回调和操作,Futures需要一些东西 称为ExecutionContext,与a非常相似 java.util.concurrent.Executor。如果你有一个范围内的ActorSystem,它 将使用其默认调度程序作为ExecutionContext,或者您可以 使用ExecutionContext协同程序提供的工厂方法 对象包装Executors和ExecutorServices,甚至创建你的 自己的。