40

I want to call an arbitrary function every n seconds. Basically I want something identical to SetInterval from Javascript. How can I achieve this in Scala?

src091
  • 2,479
  • 5
  • 35
  • 68

4 Answers4

62

You could use standard stuff from 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)

Or 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()
0__
  • 64,257
  • 16
  • 158
  • 253
23

If you happen to be on Akka, Scheduler is quite convenient for this:

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

There is also scheduleOnce for one-off execution.

The usual warnings about closing over mutable state apply.

dskrvk
  • 1,058
  • 11
  • 22
8

It can be more functional as in



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

      }

    }

arunram
  • 583
  • 6
  • 11
  • 1
    I like this solution, could you also provide an implimentation with a return value? i was thinking more like a counter down. how does `implicit def function2TimerTask(f: () => Unit): wrapper work with return value? Is this even a thing in functional – vfrank66 May 23 '19 at 21:16
5

Update for Akka, in combination with the "Hello World example" from here: Lightbend Guides using the instructions from here: Scheduler

import scala.concurrent.duration._

howdyGreeter ! WhoToGreet("Akka")

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