小编Kar*_*tik的帖子

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

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

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

但以下没有。结果getnil

(def e (java.util.concurrent.Executors/newSingleThreadExecutor))
(.get (.submit e f))
Run Code Online (Sandbox Code Playgroud)

为什么?我f通过用有副作用的东西替换它来检查它是否被调用。我能看到的唯一区别elet在一个和def另一个中绑定使用。

另一个问题。如果我没有第一个示例的类型^Callable提示,f则悄悄地返回nil. 它不应该为提交调用抛出异常“找到一个以上的匹配方法”,因为f两者都是RunnableCallable?如果我像下面这样定义f使用let,则抛出异常

(let [e (java.util.concurrent.Executors/newSingleThreadExecutor)]
  (let [f (fn [] "hello world2")]
    (try
      (.get (.submit e f))
      (finally (.shutdown e)))))
Run Code Online (Sandbox Code Playgroud)

谢谢

clojure java.util.concurrent

3
推荐指数
1
解决办法
342
查看次数

标签 统计

clojure ×1

java.util.concurrent ×1