加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读