我正在寻找循环一段时间的可能性。 例如,我想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")
}
提前致谢!
答案 0 :(得分:20)
@Radian的解决方案具有潜在的危险性,因为当您的应用程序同时运行此代码几次时,它最终将阻止ExecutorService中的所有线程。您可以更好地使用Deadline
:
import scala.concurrent.duration._
val deadline = 5.seconds.fromNow
while(deadline.hasTimeLeft) {
// ...
}
答案 1 :(得分:0)
val timeout = future{Thread.sleep(5000)}
while(!timeout.isCompleted){println("Hello")}
这有效,但我不喜欢它,因为:
另一个解决方案是将你的逻辑(打印功能)移动到一个单独的Actor中,并引入一个调度程序来处理你的时间,另一个调度程序 - 一次在一段时间后发送一个PoisonPill
答案 2 :(得分:0)
您也可以以演员的方式进行:
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)