如何阻止time.awakeEvery创建的ScalaZ进程?

时间:2016-11-25 15:29:06

标签: scalaz-stream

我从scalaz.stream.time.awakeEvery(1.second)了解到,我可以创建一个每秒创建一个事件的过程。非常明显。然后我可以映射该过程以每秒完成一些任务。到现在为止还挺好。

如果我想停止此活动该怎么办?我尝试了p.kill.run.run,其中ptime.awakeEvery(1.second)创建的流程,但它不起作用。

所以代码看起来像这样:

implicit val sc = new java.util.concurrent.ScheduledThreadPoolExecutor(1)
val p = time.awakeEvery(1.second)
p.map(println(_)).run.runAsync {
  // just some printlines
}

Thread.sleep(4000)
println("Killing")
p.kill.run.run
println("Killed")

不过,它会在打印“杀死”后打印时间,并且会一直持续下去。

如何停止进程并释放它使用的资源(线程)?我发现我可以通过关闭ScheduledThreadPoolExecutor来阻止它,但是不是有更优雅的方式吗?

1 个答案:

答案 0 :(得分:1)

您可以查看runAsyncInterruptibly上的scalaz.concurrent.Task组合子。您可以将AtomicBoolean传递给它,然后在设置为true时取消执行,或者让它返回一个在被调用时将取消执行的函数。

使用AtomicBoolean

implicit val sc = new java.util.concurrent.ScheduledThreadPoolExecutor(1)

val cancel = new java.util.concurrent.atomic.AtomicBoolean(false)

val p = time.awakeEvery(1.second)
p.map(println).run.runAsyncInterruptibly(_ => (), cancel)

Thread.sleep(4000)
println("Killing")
cancel.set(true)
println("Killed")