web-dev-qa-db-ja.com

Scalaで定期的に関数を実行する

n秒ごとに任意の関数を呼び出したいです。基本的に、JavascriptのSetIntervalと同じものが必要です。 Scalaでこれをどのように達成できますか?

32
src091

Java.util.concurrentの標準的なものを使用できます。

import Java.util.concurrent._

val ex = new ScheduledThreadPoolExecutor(1)
val task = new Runnable { 
  def run() = println("Beep!") 
}
val f = ex.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS)
f.cancel(false)

またはJava.util.Timer

val t = new Java.util.Timer()
val task = new Java.util.TimerTask {
  def run() = println("Beep!") 
}
t.schedule(task, 1000L, 1000L)
task.cancel()
46
0__

たまたまAkkaを使用している場合、 Scheduler はこれに非常に便利です。

val system = ActorSystem("mySystem", config)
// ...now with system in current scope:
import system.dispatcher
system.scheduler.schedule(10 seconds, 1 seconds) {
  doSomeWork()
}

1回限りの実行用のscheduleOnceもあります。

変更可能な状態を閉じることに関する通常の警告が適用されます。

17
dskrvk

より機能的にすることができます



    import Java.util.TimerTask
    import Java.util.Timer

    object TimerDemo {
      implicit def function2TimerTask(f: () => Unit): TimerTask = {
        return new TimerTask {
          def run() = f()
        }
      }

      def main(args : Array[String]) {
        def timerTask() = println("Inside timer task")

        val timer = new Timer()
        timer.schedule(function2TimerTask(timerTask),100, 10)

        Thread.sleep(5000)

        timer.cancel()

      }

    }

8
arunram

ここからの「Hello Worldの例」と組み合わせたAkkaの更新: Lightbend Guides ここからの指示を使用: Scheduler

import scala.concurrent.duration._

howdyGreeter ! WhoToGreet("Akka")

val cancellable =
system.scheduler.schedule(
  0 seconds,
  1 seconds,
  howdyGreeter,
  Greet
)