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?
Asked
Active
Viewed 3.0k times
4 Answers
75
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__
- 66,707
- 21
- 171
- 266
-
2It's important to add a handler in case the task fails because of an exception. – Shannon Sep 20 '18 at 19:45
27
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,318
- 15
- 24
9
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
- 623
- 7
- 11
-
1I 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
)

Jan Clemens Stoffregen
- 831
- 10
- 9
-
Thanks for the answer. Can you please clarify where `system` is supposed to imported from? – akki Jan 03 '19 at 08:05
-