【发布时间】:2016-11-26 01:44:36
【问题描述】:
我一直在查看此演示文稿https://github.com/indyscala/scalaz-task-intro/blob/master/presentation.md,并对它使用 Task.runAsyncInterruptibly 演示的代码 sn-ps 之一感到困惑(稍作修改如下所示):
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!好的。我纠正了这一点。还是不行。
提前感谢您提供的任何指导。
【问题讨论】:
标签: scala concurrency task scalaz