【发布时间】:2013-05-14 17:37:03
【问题描述】:
我看到了一个例子here:
val fut = Future { ... // 我的身体功能 } // 我的身体功能从这里开始 fut onComplete { ... // 我的回调 }看起来我可以在我的主体函数完成之后添加回调。它仍然被调用吗?无论如何,我宁愿在我的函数开始运行之前向未来添加回调。是否有意义 ?我该怎么做?
【问题讨论】:
标签: scala concurrency future
我看到了一个例子here:
val fut = Future { ... // 我的身体功能 } // 我的身体功能从这里开始 fut onComplete { ... // 我的回调 }看起来我可以在我的主体函数完成之后添加回调。它仍然被调用吗?无论如何,我宁愿在我的函数开始运行之前向未来添加回调。是否有意义 ?我该怎么做?
【问题讨论】:
标签: scala concurrency future
文档非常清楚您的第一点:
如果未来注册时已经完成 回调,则回调可以异步执行,或者 在同一个线程上按顺序。
至于您的后一个问题-您可以将需要运行的代码作为未来正文的第一行,例如:
def futureWithBefore[T](body: => T, before: => Any) = future {
before()
body()
}
【讨论】:
如果你想控制未来的执行点,你可以用Promise链接它。
import scala.concurrent._
import ExecutionContext.Implicits.global
val initialPromise = promise[Unit]
// add your computations
val fut = initialPromise.future map { _ => println("My Future") }
// register callbacks
fut onComplete { _ => println("My Callback") }
// run
initialPromise.success()
使用 Unit 以外的其他东西可以让您为计算提供任意值。
【讨论】:
或者类似的东西:
$ skala
Welcome to Scala version 2.11.0-20130423-194141-5ec9dbd6a9 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_06).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :pa
// Entering paste mode (ctrl-D to finish)
import scala.concurrent._
import ExecutionContext.Implicits.global
// Exiting paste mode, now interpreting.
import scala.concurrent._
import ExecutionContext.Implicits.global
scala> val x = Future { Thread sleep 60000L ; 7 }
x: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@44b0c913
scala> def todo = println("Extra work before the job.")
todo: Unit
scala> def something(i: Int) = { todo ; i }
something: (i: Int)Int
scala> x map something
res0: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@2a5457ea
scala> def f(i: Int) = { println(s"Job $i"); i+1 }
f: (i: Int)Int
scala> .map (f)
res1: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@32bc46f4
scala> .value
res2: Option[scala.util.Try[Int]] = None
scala> Await result (res1, duration.Duration("60 seconds"))
Extra work before the job.
Job 7
res3: Int = 8
是的,我需要一点时间来输入。
【讨论】: