考虑以下MWE:
(ns toto.core
(:gen-class))
(defn write-something [i]
(spit (str "out-" (str i) ".txt") "Hi there!"))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(dorun (pmap write-something (range 16))))
如果我从复制中运行-main
,则可以按预期运行:它可以创建文件和返回。但是,如果我创建一个Uberjar并运行java -jar <toto.whatever-standalone.jar>
,它将创建文件,但无法退出程序。我怀疑这是懒惰的问题,但是无法弄清楚为什么dorun
无法正常工作。 关于我做错了什么的想法?
在clojure中,pmap函数使用了利用公共线程池的未来调用。泳池中的线程在完成任务后将其存活1分钟,以降低线程分配的成本。
如果您确定可以关闭线程池(因为应用程序退出)您需要致电(dorun ...)
之后的关闭代理,因此线池被杀死。
另外,您可以致电(System/exit <status>)
立即关闭应用程序。