为什么Scala的Future.onComplete需要一个ExecutionContext
发布时间:2020-12-16 18:08:15 所属栏目:安全 来源:网络整理
导读:不能Promise.complete只运行Future.onComplete的回调,而不是一直通过ExecutionContext,并且,据我所知,安排Future.onComplete的回调以后可能在另一个线程中运行它? 解决方法 您可以为onComplete提供自己的ExecutionContext,它将在同一个线程上运行代码: val
不能Promise.complete只运行Future.onComplete的回调,而不是一直通过ExecutionContext,并且,据我所知,安排Future.onComplete的回调以后可能在另一个线程中运行它?
解决方法
您可以为onComplete提供自己的ExecutionContext,它将在同一个线程上运行代码:
val immediateContext: ExecutionContext = new ExecutionContext { def execute(runnable: Runnable) { runnable.run() } def reportFailure(cause: Throwable) {} } 您甚至可以将其隐含,并且对于您希望在另一个线程中执行执行的情况,您可以提供scala.concurrent.ExecutionContext.global或其他一些上下文. 这是一个测试,它是如何工作的: val immediateContext: ExecutionContext = new ExecutionContext { override def reportFailure(cause: Throwable): Unit = {} override def execute(runnable: Runnable): Unit = { println("Executing") runnable.run() println("Executed") } } def testContext(): Unit = { println("Scheduling on an uncompleted future") val p = Promise[Int]() println("Scheduling") p.future.onComplete { _ => println("Completed") }(immediateContext) println("Scheduled") p.complete(Success(5)) println() println("Scheduling on an already completed future") val p2 = Promise[Int]().complete(Success(5)) println("Scheduling") p2.future.map { n => println("Mapping") n * 2 }(immediateContext).onComplete{ case Success(n) => println(s"Completed: $n") case _ => }(immediateContext) println("Scheduled") println() println("Using scala.concurrent.ExecutionContext.global for comparison") val p3 = Promise[Int]().complete(Success(5)) println("Scheduling") p3.future.onComplete { _ => println("Completed") }(concurrent.ExecutionContext.global) println("Scheduled") } 运行testContext()将打印 Scheduling on an uncompleted future Scheduling Scheduled Executing Completed Executed Scheduling on an already completed future Scheduling Executing Mapping Executed Executing Completed: 10 Executed Scheduled Using scala.concurrent.ExecutionContext.global for comparison Scheduling Scheduled Completed (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |