如何在clojure REPL中停止孤立线程

时间:2014-01-28 05:12:06

标签: clojure clojure-repl

我正在做与clojure相关的线程。

现在我正在使用REPL,在REPL中编写和更新代码。

我的问题是,有时会有一些期货继续运行。我因某种错误而失去了裁判。我阻止它们的唯一方法是重启repl。

我想知道有没有办法阻止正在运行的期货(线程),如果我没有参考它们?

1 个答案:

答案 0 :(得分:1)

Clojure public API提供了停止运行期货的唯一方法,如下所示:

(shutdown-agents)

但这不会打断你未来的工作。而不是你可以用

打断它们
(import 'clojure.lang.Agent)
(.shutdownNow Agent/soloExecutor)

但请记住,在描述操作后,您Agent/soloExecutor将不接受新任务。处理它的方法之一是在Agent类中重新分配soloExecutor java字段。希望它是公开的而不是最终的。

(import 'java.util.concurrent.Executors) 
(set! Agent/soloExecutor (Executors/newCachedThreadPool)) ;; in original clojure version thread pool is created with thread factory, but that createThreadFactory method is private, anyways for your purposes this code may work just fine without any thread factories.

(future (Thread/sleep 1000) (println "done") 100) ;; now works fine

但在我看来,建议不要在repl中制作东西。最好不要丢失未来的参考资料。