在向java.util.concurrent.ExecutorService提交函数后获取Future的结果

时间:2013-09-07 16:58:21

标签: clojure java.util.concurrent

以下作品。结果是“你好世界”

  (def ^Callable f (fn [] "hello world"))
  (let [e (java.util.concurrent.Executors/newSingleThreadExecutor)]
    (try
      (.get (.submit e f))
      (finally (.shutdown e))))

但以下情况并非如此。 get的结果是nil

(def e (java.util.concurrent.Executors/newSingleThreadExecutor))
(.get (.submit e f))

为什么呢?我检查了f是否被调用,用一些有副作用的东西替换它。我能看到的唯一区别是e在一个let和另一个def中绑定。

另一个问题。如果我没有^Callable的{​​{1}}类型提示,则第一个示例会安静地返回f。由于nil同时为fRunnable,因此不应该为提交调用抛出异常“找到多个匹配方法”吗?如果我使用Callable定义f,如下所示,则抛出异常

let

由于

1 个答案:

答案 0 :(得分:4)

问题是无法在

中推断出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"。当使用e定义let时,clojure会以某种方式推断出正确的类型,因此不需要类似的类型提示。

*warn-on-reflection*设置为true有助于调试此问题。