从外部输入改变值的流

时间:2018-11-30 23:35:03

标签: scala

我想做

while(isRunning) {
   // do something
}

并且可以从另一个线程执行isRunning = false,并停止上述循环。

但是,我想以一种类似于Scala的方式进行操作。

我尝试过的一种方法是:

object Watcher {
  var run: Boolean = true
  def getIsRunning: Stream[Boolean] = {
    { Thread.sleep(1000); run } #:: getIsRunning
  }
}

然后我要去做:

Watcher.getIsRunning.takeWhile { isRunning => 
  if (isRunning) { 
     println("I am running")
  } else {
     println("I am not running")
  }
  isRunning
}

但是(显然现在)它不起作用,因为takeWhile返回了另一个流,并且不像while循环那样每次都重新评估run的值。

有什么方法可以做我想要的吗?

1 个答案:

答案 0 :(得分:3)

我不确定“现在明显”是指什么……对我来说,为什么你认为这不起作用(实际上,我认为应该如此)并不明显。我不太清楚为什么它需要变得如此复杂(而while循环又出了什么问题),但是在功能上,似乎没有什么问题...

另一种(可能甚至更像“ scala-like”的)方式是使用期货:

   def whileRunning(f: => Unit): Future[Unit] = Future(f).flatMap {
     case _ if isRunning => whileRunning(f)
     case _ => Future.successful
   }         

现在,您可以执行whileRunning(doWork) ...并且它没有阻塞,因此您可以稍后再实际执行isRunning=true(确保它为@volatile)。