我一直在尋找本演示https://github.com/indyscala/scalaz-task-intro/blob/master/presentation.md和感到困惑的代碼片段一個它呈現的使用Task.runAsyncInterruptibly(略作修改下面出現):知道爲什麼scalaz Task.runAsyncInterruptibly沒有打擾我會期待它
import java.util.concurrent.atomic.AtomicBoolean
import scalaz.concurrent.Task
import scalaz.{-\/, \/-}
object Junk extends App {
val neverMind = new AtomicBoolean(false)
System.out.println(s"neverMind set to $neverMind on thread ${Thread.currentThread().getName}")
val t = Task {
System.out.println(s" in task run block on thread ${Thread.currentThread().getName}")
Thread.sleep(4000)
System.out.println(s" completed sleep of 40000 ms on thread ${Thread.currentThread().getName}")
}
Task.fork(t).
//t.
runAsyncInterruptibly({
case -\/(t) => t.printStackTrace()
case \/-(()) => println(s"Completed (right) branch of case on thread ${Thread.currentThread().getName}")
}, neverMind)
println("sleeping 1000, then set nevermind to true")
Thread.sleep(1000)
neverMind.set(true)
println("woke up. set cancel=true -- expect stack trace not 'Completed' message")
Thread.sleep(4000)
}
我很困惑,因爲我設置了'取消'標誌(neverMind.set(true)),但是我沒有看到堆棧跟蹤。延遲{...}內的代碼塊最終打印出'成功完成'。這很簡單,我相信我正在犯一個愚蠢的錯誤..不知道在哪裏!
我從一些同事那裏尋求建議,他指出我原來的例子沒有使用Task.fork(),所以我在同一個線程上做了所有事情...... doh!好。我糾正了這一點。它仍然不起作用。
在此先感謝您提供的任何指導。