web-dev-qa-db-fra.com

Exécuter une fonction périodiquement dans Scala

Je veux appeler une fonction arbitraire toutes les n secondes. En gros, je veux quelque chose d’identique à SetInterval à partir de Javascript. Comment puis-je y parvenir en Scala?

30
Anton

Vous pouvez utiliser des éléments standard de 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)

Ou 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()
41
0__

Si vous vous trouvez sur Akka, Scheduler est très pratique pour cela:

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

Il existe également scheduleOnce pour une exécution unique.

Les avertissements habituels concernant la fermeture d'un état mutable s'appliquent.

14
dskrvk

Il peut être plus fonctionnel que dans 



    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()

      }

    }

7
arunram

Mise à jour pour Akka, en combinaison avec l'exemple "Hello World": Guides Lightbend en suivant les instructions à partir d'ici: Scheduler

import scala.concurrent.duration._

howdyGreeter ! WhoToGreet("Akka")

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