Scala循环一段时间



我正在寻找一种在一定时间内循环的可能性。例如,我想打印ln("你好!")5分钟。

我用的是Scala和Akka。

我在考虑使用future,它将在5分钟内完成,同时我会使用while循环检查它是否未完成。这种方法对我不起作用,因为我的班不是演员,我无法从循环之外完成未来。

有什么想法,或者可能有现成的解决方案吗?

当前丑陋的解决方案:

    def now = Calendar.getInstance.getTime.getTime
    val ms = durationInMins * 60 * 1000
    val finish = now + ms
    while (now <= finish) {
       println("hi")
    }

提前感谢!

@Radian的解决方案具有潜在的危险性,因为当您的应用程序同时运行此代码几次时,它最终会阻塞ExecutorService中的所有线程。你可以更好地使用Deadline

import scala.concurrent.duration._
val deadline = 5.seconds.fromNow
while(deadline.hasTimeLeft) {
  // ...
}
val timeout = future{Thread.sleep(5000)}
while(!timeout.isCompleted){println("Hello")}

这是有效的,但我不喜欢它,因为:

  1. 长时间不睡觉是不好的
  2. 主线程中的长循环正在阻塞您的应用程序

另一个解决方案是将您的逻辑(打印功能)移动到一个单独的Actor中,并引入一个调度器来为您处理时间,另一个调度器在持续时间后发送一个毒丸

有关Scheduler 的更多信息

您也可以用actor方式来完成:

case object Init
case object Loop
case object Stop
class Looper extends Actor {
    var needToRun = true
    def receive = {
        case Init =>
            needToRun = true
            self ! Loop
        case Stop =>
            needToRun = false
        case Loop =>
            if(needToRun) {
                //do whatever you need to do
                self ! Loop
            }
    }
}

并使用调度器发送消息:

looperRef ! Init
system.scheduler.scheduleOnce(5 MINUTES, looperRef, Stop)

最新更新