当调用线程被打断时,取消引用一个已交付的承诺将抛出InterruptedException
。
(let [p (promise)]
(deliver p :value)
(.interrupt (Thread/currentThread))
(assert (realized? p))
(deref p)) ;; => InterruptedException
这是出乎意料的,因为检索已兑现承诺的值不应该阻塞。
使用Promesa库中的CompletableFuture
不会抛出
(require '[promesa.core :as p]) ;'
(let [p (p/deferred)]
(p/resolve! p :value)
(.interrupt (Thread/currentThread))
(deref p)) ;; => ::value