2016-11-26 58 views
1

我一直在尋找本演示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!好。我糾正了這一點。它仍然不起作用。

在此先感謝您提供的任何指導。

回答

1

我想答案已經做scalaz的任務/未來幾年內的蹦牀,因爲它只是在步驟(間檢查cancel看到listenInterruptibly內scalaz的Future

如果更改任務:

val t = Task.delay(System.out.println(s" in task run block on thread ${Thread.currentThread().getName}")) 
.map(_ => Thread.sleep(4000)) 
.map(_ => System.out.println(s" completed sleep of 40000 ms on thread ${Thread.currentThread().getName}")) 

你會發現它在「完成睡眠」步驟之前被取消,但它似乎仍然不打電話給打印堆棧跟蹤的處理程序,但是,

相關問題