我从scalaz.stream.time.awakeEvery(1.second)
了解到,我可以创建一个每秒创建一个事件的过程。非常明显。然后我可以映射该过程以每秒完成一些任务。到现在为止还挺好。
如果我想停止此活动该怎么办?我尝试了p.kill.run.run
,其中p
是time.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来阻止它,但是不是有更优雅的方式吗?
答案 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")