2013-08-21 114 views
5

我正在尋找循環一段時間的可能性。例如,我想println(「你好!」)5分鐘。斯卡拉循環一定的時間

我正在使用Scala和Akka。

我正在考慮使用未來,這將在5分鐘內完成,與此同時,我會在循環使用時檢查它未完成。這種方法對我不起作用,因爲我的班不是演員,而且我也無法在循環之外完成未來。

任何想法或可能有這樣的事情的現成解決方案?

當前醜陋的解決方案:

def now = Calendar.getInstance.getTime.getTime 
    val ms = durationInMins * 60 * 1000 
    val finish = now + ms 

    while (now <= finish) { 
     println("hi") 
    } 

提前感謝!

回答

16

@Radian的方法有潛在的危險,因爲它最終會阻塞在ExecutorService的,當你的應用程序運行這段代碼幾次同時所有的線程。您可以更好地使用一個Deadline

import scala.concurrent.duration._ 

val deadline = 5.seconds.fromNow 

while(deadline.hasTimeLeft) { 
    // ... 
} 
+0

它看起來像我正在尋找的東西,謝謝 – psisoyev

0
val timeout = future{Thread.sleep(5000)} 
while(!timeout.isCompleted){println("Hello")} 

這工作,但我不喜歡它,因爲:

  1. 龍環路而不睡不好。
  2. 在主線程龍環阻止你的應用程序

另一種解決方案,將是你的邏輯(打印功能)移動到一個單獨的演員,並引入調度處理的時機找你,另一調度一次,到時間後發送PoisonPill

More about Scheduler

+0

感謝回答。我已經添加了我的第一篇文章,我現在的解決方案,這是醜陋的地獄。我想避免while循環,但沒有看到可能性。雖然循環不好,但我不喜歡它們。 – psisoyev

+0

我建議你使用調度程序,我更新了我的答案。 – Radian

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)