Clojure 将函数提交到java.util.concurrent.ExecutorService后获取未来结果
下面的工作。结果是“你好,世界” 但以下情况并非如此。Clojure 将函数提交到java.util.concurrent.ExecutorService后获取未来结果,clojure,java.util.concurrent,Clojure,Java.util.concurrent,下面的工作。结果是“你好,世界” 但以下情况并非如此。get的结果是nil (def e (java.util.concurrent.Executors/newSingleThreadExecutor)) (.get (.submit e f)) 为什么??我检查了f是否被调用,并将其替换为具有副作用的内容。我能看到的唯一区别是e在其中一个中使用let,在另一个中使用def进行绑定 另一个问题。如果我没有f的^Callable类型提示,那么第一个示例会安静地返回nil。由于f既是Runnabl
get
的结果是nil
(def e (java.util.concurrent.Executors/newSingleThreadExecutor))
(.get (.submit e f))
为什么??我检查了f
是否被调用,并将其替换为具有副作用的内容。我能看到的唯一区别是e
在其中一个中使用let
,在另一个中使用def
进行绑定
另一个问题。如果我没有f
的^Callable
类型提示,那么第一个示例会安静地返回nil
。由于f
既是Runnable
又是Callable
,它不应该为submit调用抛出异常“找到多个匹配方法”吗?如果我像下面那样使用let
定义f
,则会引发异常
(let [e (java.util.concurrent.Executors/newSingleThreadExecutor)]
(let [f (fn [] "hello world2")]
(try
(.get (.submit e f))
(finally (.shutdown e)))))
谢谢问题在于无法在中推断出
e
的类型
(def e (java.util.concurrent.Executors/newSingleThreadExecutor))
当我把这个改成
(def ^java.util.concurrent.ExecutorService e (java.util.concurrent.Executors/newSingleThreadExecutor))
然后(.get(.submit e f))
给出正确的答案“hello world”
。当使用let
定义e
时,clojure推断出正确的类型,因此不需要类似的类型提示
将*反射时警告*
设置为true
有助于调试此问题
(def ^java.util.concurrent.ExecutorService e (java.util.concurrent.Executors/newSingleThreadExecutor))