1

scalaz.stream.time.awakeEvery(1.second)1 秒ごとにイベントを作成するプロセスを作成できることを学びました。非常に明白です。次に、そのプロセスをマッピングして、毎秒何らかのタスクを達成できます。ここまでは順調ですね。

この活動を停止したい場合はどうすればよいですか? によって作成されたプロセスは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 をシャットダウンすることで停止できることがわかりましたが、もっとエレガントな方法はありませんか?

4

1 に答える 1

1

runAsyncInterruptiblyのコンビネータを見てくださいscalaz.concurrent.TaskAtomicBooleanに設定すると実行をキャンセルする を渡すか、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 に答える