Scala循环一定时间
我在寻找一种在一定时间内循环的可能性。 例如,我想打印ln(“你好!”)5分钟 我用的是Scala和Akka 我正在考虑使用future,它将在5分钟内完成,同时我将使用while循环,检查它是否未完成。这种方法对我不起作用,因为我的班级不是演员,我不能从圈外完成未来 有什么想法或者可能有现成的解决方案吗 当前的解决方案: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
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)