我想做
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
的值。
有什么方法可以做我想要的吗?
答案 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
)。