Run a function periodically in Scala

前端 未结 4 547
被撕碎了的回忆
被撕碎了的回忆 2020-12-24 07:01

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

相关标签:
4条回答
  • 2020-12-24 07:21

    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 讨论(0)
  • 2020-12-24 07:26

    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()
    
          }
    
        }
    
    
    0 讨论(0)
  • 2020-12-24 07:29

    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
    )
    
    0 讨论(0)
  • 2020-12-24 07:32

    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.

    0 讨论(0)
提交回复
热议问题