1

我了解到,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")

尽管如此,它仍然会在打印“Killed”之后打印时间,并且一直持续下去。

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

4

1 回答 1

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")
于 2016-12-06T18:35:03.833 回答