gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:41:09 25 4
gpt4 key购买 nike

以下作品。结果是“ Hello World ”

  (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 绑定(bind),在另一个中使用 def 绑定(bind)。

另一个问题。如果我没有 f^Callable 类型提示,第一个示例会安静地返回 nil。既然 f 既是 Runnable 又是 Callable,难道它不应该为提交调用抛出“找到多个匹配方法”的异常吗?如果我像下面这样使用 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 以某种方式推断出正确的类型,因此不需要类似的类型提示。

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

关于clojure - 将函数提交给 java.util.concurrent.ExecutorService 后获取 Future 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18675724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com