Scala循环一定时间

Scala循环一定时间,scala,loops,akka,Scala,Loops,Akka,我在寻找一种在一定时间内循环的可能性。 例如,我想打印ln(“你好!”)5分钟 我用的是Scala和Akka 我正在考虑使用future,它将在5分钟内完成,同时我将使用while循环,检查它是否未完成。这种方法对我不起作用,因为我的班级不是演员,我不能从圈外完成未来 有什么想法或者可能有现成的解决方案吗 当前的解决方案: def now = Calendar.getInstance.getTime.getTime val ms = durationInMins * 60 * 1

我在寻找一种在一定时间内循环的可能性。 例如,我想打印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")
    }
def now=Calendar.getInstance.getTime.getTime
val ms=持续时间分钟*60*1000
val finish=now+ms
(现在)
这很有效,但我不喜欢,因为:

  • 没有睡眠的长循环是不好的
  • 主线程中的长循环阻塞了应用程序
  • 另一个解决方案是,将您的逻辑(打印功能)移动到一个单独的参与者中,并引入一个调度器来为您处理计时,另一个调度器在一段时间后发送毒药


    当你的应用程序同时运行此代码数次时,@Radian的解决方案有潜在的危险,因为它最终会阻塞ExecutorService中的所有线程。为此,你最好使用
    截止日期

    import scala.concurrent.duration._
    
    val deadline = 5.seconds.fromNow
    
    while(deadline.hasTimeLeft) {
      // ...
    }
    

    您也可以采用演员的方式进行:

    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)
    

    谢谢你的回答。我在我的第一篇文章中也添加了我当前的解决方案,这非常难看。我想避免while循环,但没有看到任何可能性。并不是说while循环不好,而是我不喜欢它们。
    looperRef ! Init
    system.scheduler.scheduleOnce(5 MINUTES, looperRef, Stop)