在调用线程被中断的情况下,取消引用一个 已履行 的承诺将抛出 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