繁体   English   中英

Scala循环一段时间

[英]Scala looping for certain duration

我正在寻找循环一段时间的可能性。 例如,我想println(“你好!”)5分钟。

我正在使用Scala和Akka。

我正在考虑使用未来,它将在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中,并引入一个调度程序来处理您的时间,另一个调度程序 - 一次在一段时间后发送一个PoisonPill

有关Scheduler的更多信息

你也可以以演员的方式做到:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM