In Java Scheduled Executor を使用して、指定された遅延後に実行するタスクをスケジュールできます。Scalaで使用できますが、そのためのScalaAPIがあるかどうか疑問に思います。
タスクをスケジュールするためのScala API(JavaのScheduled Executor
とは対照的)はありますか?
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など)を使用している場合は、それが最適な方法です。
スケジュールされた実行のためのscala apiも探していました。
JavaのScheduledExecutor:
私は少しscalaシングルタスクスケジューリングのラッパーを書きました。要点を参照してください: https://Gist.github.com/platy/8f0e634c64d9fb54559c
Scalazのタスクを使用できます。
import scala.concurrent.duration.{FiniteDuration, SECONDS}
import scalaz.concurrent.Task
Task.schedule(Console.println("time's up"), FiniteDuration(5, SECONDS)).runAsync { _ => }
以前は、重複した質問がこのおもちゃになりました。
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
別の方法として、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()