2013-08-21 6 views
5

Ich bin auf der Suche nach einer Möglichkeit, für bestimmte Dauer zu loopen. Zum Beispiel möchte ich für 5 Minuten println ("Hallo!").Scala Looping für eine bestimmte Dauer

Ich benutze Scala und Akka.

Ich dachte über die Verwendung von Zukunft, die in 5 Minuten fertig sein wird, in der Zwischenzeit würde ich während Zyklus darauf mit der Überprüfung verwenden, dass es nicht abgeschlossen ist. Ein solcher Ansatz funktioniert nicht für mich, da meine Klasse kein Schauspieler ist und ich die Zukunft nicht von außerhalb der Schleife beenden kann.

Irgendwelche Ideen oder vielleicht gibt es fertige Lösungen für solche Dinge?

Aktuelle hässliche Lösung:

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

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

Vielen Dank im Voraus!

Antwort

16

die Lösung von @Radian zu senden potenziell gefährlich, da es schließlich alle Fäden in der ExecutorService blockieren wird, wenn Ihre Anwendung dieser Code ausgeführt wird gleichzeitig mehrmals . Sie können besser eine Deadline dafür verwenden:

import scala.concurrent.duration._ 

val deadline = 5.seconds.fromNow 

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

Es sieht aus wie etwas, das ich gesucht habe, danke – psisoyev

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

Dies funktioniert, aber ich weiß nicht, wie es da:

  1. Lange Schleifen ohne schläft schlecht sind.
  2. Lange Schleifen in dem Haupt Thema sind Ihre Anwendung

Eine andere Lösung blockiert, wäre Ihre Logik (die Druckfunktion) in einen separaten Darsteller zu bewegen, und einen Scheduler einführte den Zeitpunkt für Sie zu handhaben, und ein anderer Scheduler einmal eine PoisonPill nach einer Dauer ist

More about Scheduler

+0

Vielen Dank für die Antworten. Ich habe zu meinem ersten Beitrag auch meine aktuelle Lösung hinzugefügt, die hässlich ist. Ich möchte while-Schleife vermeiden, sehe aber keine Möglichkeit. Nicht dass While Loops schlecht sind, aber ich mag sie einfach nicht. – psisoyev

+0

Ich schlage vor, Sie verwenden einen Scheduler, ich aktualisierte meine Antwort. – Radian

0

Sie auch in der Schauspieler Weise tun können:

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 
      } 
    } 
} 

Und Scheduler verwenden, um eine Nachricht zu senden:

looperRef ! Init 
system.scheduler.scheduleOnce(5 MINUTES, looperRef, Stop) 
Verwandte Themen