2014-01-28 32 views
1

我正在做一些与clojure线程相关的东西。如何停止clojure中的孤线程REPL

现在我在REPL中工作,在REPL中编写和更新代码。

我的问题是,有时候会有一些期货交易。我由于某种错误而失去了裁判。我唯一的办法就是重新启动repl。

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

回答

1

Clojure的公共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中的东西。最好不要失去未来的参考。

+0

我在repl中试过了,但是在我调用shutdown之后,未来似乎仍在运行。如果我按下输入键,repl将退出。 无论如何,感谢有关代理和soloExecutor的答案。 – Mavlarn

+0

这是我的错。检查更新的答案 – hsestupin