16

在 Java 中,我可以使用Scheduled Executor来安排任务在给定延迟后运行。我可以在 Scala 中使用它,但我想知道是否有一个Scala API。

是否有任何 Scala API(相对于Scheduled ExecutorJava)来安排任务?

4

4 回答 4

32

Akka 与调度程序有类似的东西:

http://doc.akka.io/api/akka/2.1.4/#akka.actor.Scheduler

您可以从actor系统中获取一个:

val actorSystem = ActorSystem()
val scheduler = actorSystem.scheduler
val task = new Runnable { def run() { log.info("Hello") } }
implicit val executor = actorSystem.dispatcher

scheduler.schedule(
  initialDelay = Duration(5, TimeUnit.SECONDS),
  interval = Duration(10, TimeUnit.SECONDS),
  runnable = task)

如果您使用的是 Akka 或基于它的东西,例如 Play,那将是您的选择。

于 2013-05-18T15:44:04.770 回答
8

我也一直在寻找用于计划执行的 scala api。

Java 的 ScheduledExecutor:

  • 使用线程池来运行调度程序和操作超时,因此每次超时不需要线程
  • 不需要阿卡

我为单个任务调度编写了一个小的 scala 包装器。见要点: https ://gist.github.com/platy/8f0e634c64d9fb54559c

于 2015-01-25T01:25:58.630 回答
4

作为替代方案,还有 Monix 调度程序: https ://monix.io/docs/3x/execution/scheduler.html

它使用了Java的Scheduled Executor背后,但它是包装和透明的。

你需要实现一些Runnable来执行,这比 Akka 更轻Actor

例如,您可以这样做(取自文档):

lazy val scheduler =
  Scheduler.singleThread(name="my-thread")

// First execution in 3 seconds, then every 5 seconds
val c = scheduler.scheduleAtFixedRate(
  3, 5, TimeUnit.SECONDS,
  new Runnable {
    def run(): Unit = {
      println("Fixed delay task")
    }
  })

// If we change our mind and want to cancel
c.cancel()
于 2019-02-19T11:19:53.737 回答
4

你可以使用scalaz的任务,

import scala.concurrent.duration.{FiniteDuration, SECONDS}
import scalaz.concurrent.Task
Task.schedule(Console.println("time's up"), FiniteDuration(5, SECONDS)).runAsync { _ => }
于 2016-11-21T18:51:48.427 回答