Scala中的预定执行程序

时间:2013-05-18 14:38:48

标签: scala scheduled-tasks

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

是否有任何Scala API(与Java中的Scheduled Executor相对)来安排任务?

5 个答案:

答案 0 :(得分:29)

Akka与调度程序类似:

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

你可以从演员系统中获得一个:

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,那将是最佳选择。

答案 1 :(得分:5)

我一直在为计划执行寻找scala api。

Java的ScheduledExecutor:

  • 使用线程池来运行调度程序并运行超时,因此不需要每个超时的线程
  • 不需要akka

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

答案 2 :(得分:4)

此前,一个重复的问题导致了这个玩具。

scala> implicit class Expiry(val d: Deadline) extends AnyVal {
     | def expiring(f: =>Unit) =
     | future(Await.ready(Promise().future, d.timeLeft)) onComplete (_ => f)
     | }
defined class Expiry

scala> val x = new SyncVar[Boolean]()
x: scala.concurrent.SyncVar[Boolean] = scala.concurrent.SyncVar@597d9abe

scala> 10 seconds fromNow expiring {
     | println("That's all, folks.")
     | x.put(true)
     |     }

scala> x.take() 
That's all, folks.
res1: Boolean = true

答案 3 :(得分:3)

您可以使用scalaz的任务,

import scala.concurrent.duration.{FiniteDuration, SECONDS}
import scalaz.concurrent.Task
Task.schedule(Console.println("time's up"), FiniteDuration(5, SECONDS)).runAsync { _ => }

答案 4 :(得分:2)

另外,还有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()