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

如何将基于时间的观察者添加到Scala Future?

发布时间:2020-12-16 18:31:41 所属栏目:安全 来源:网络整理
导读:我想在 Scala Futures中添加一个after(d:FiniteDuration)(callback:= Unit)util,它可以让我这样做: val f = Future(someTask)f.after(30.seconds) { println("f has not completed in 30 seconds!")}f.after(60.seconds) { println("f has not completed
我想在 Scala Futures中添加一个after(d:FiniteDuration)(callback:=> Unit)util,它可以让我这样做:

val f = Future(someTask)

f.after(30.seconds) {
  println("f has not completed in 30 seconds!")
}

f.after(60.seconds) {
  println("f has not completed in 60 seconds!")
}

我怎样才能做到这一点?

解决方法

通常我使用线程池执行器并承诺:

import scala.concurrent.duration._
import java.util.concurrent.{Executors,ScheduledThreadPoolExecutor}
import scala.concurrent.{Future,Promise}

val f: Future[Int] = ???

val executor = new ScheduledThreadPoolExecutor(2,Executors.defaultThreadFactory(),AbortPolicy)

def withDelay[T](operation: ? T)(by: FiniteDuration): Future[T] = {
  val promise = Promise[T]()
  executor.schedule(new Runnable {
    override def run() = {
      promise.complete(Try(operation))
    }
  },by.length,by.unit)
  promise.future
}

Future.firstCompletedOf(Seq(f,withDelay(println("still going"))(30 seconds)))
Future.firstCompletedOf(Seq(f,withDelay(println("still still going"))(60 seconds)))

(编辑:李大同)

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

    推荐文章
      热点阅读