2013-05-18 3 views
12

В Java я могу использовать Scheduled Executor для планирования задач, которые будут выполняться после заданной задержки. Я могу использовать его в Scala, но мне интересно, есть ли для этого API Scala.Запланированный Исполнитель в Scala

Есть ли какой-либо Scala API (в отличие от Scheduled Executor в Java) для планирования задач?

ответ

25

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) 

Если вы используете Акку или что-то на его основе, как игры, это был бы путь.

+4

Почему люди думают Scala == Акка? –

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] = [email protected] 

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

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

Спасибо. Liked 'future (Await.ready (Promise(). Future, d.timeLeft))' как альтернатива 'Thread.sleep', который не принимает поток. – Michael

+9

Собственно, будьте предупреждены, что он ** делает ** поток (он блокирует один из потоков пула потоков ExecutionContext). –

+2

Я должен был упомянуть, что это злая игрушка. –

3

Я искал scala api для запланированного выполнения.

ScheduledExecutor в Java:

  • использует пул потоков для запуска планировщика и управления таймаутами, и поэтому не требует потока на тайм-аут
  • Нет Akka не нужно

я написал небольшая оболочка scala для планирования отдельных задач. Смотрите суть: https://gist.github.com/platy/8f0e634c64d9fb54559c

2

Вы можете использовать Task scalaz, в

import scala.concurrent.duration.{FiniteDuration, SECONDS} 
import scalaz.concurrent.Task 
Task.schedule(Console.println("time's up"), FiniteDuration(5, SECONDS)).runAsync { _ => } 
Смежные вопросы