2016-11-25 7 views
1

私はそれを学んだscalaz.stream.time.awakeEvery(1.second) 1秒ごとにイベントを作成するプロセスを作成できます。かなり明白です。そのプロセスをマップして毎秒何らかのタスクを達成することができます。ここまでは順調ですね。ScalaZ Processを停止する方法time.awakeEvery?

このアクティビティを停止したい場合はどうすればよいですか?私は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

scalaz.concurrent.TaskrunAsyncInterruptiblyコンビネータをご覧ください。 AtomicBooleanを渡すことができます。trueに設定すると実行がキャンセルされます。また、呼び出されたときに実行をキャンセルする関数が返されます。

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") 

AtomicBooleanを使用して

関連する問題