2

我正在做一些与 clojure 线程相关的事情。

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

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

我想知道如果我没有参考,是否有任何方法可以停止正在运行的期货(线程)?

4

1 回答 1

2

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

(shutdown-agents)

但这不会影响你未来的工作。取而代之的是,您可以打断他们

(import 'clojure.lang.Agent)
(.shutdownNow Agent/soloExecutor)

但请记住,在描述的操作之后,您Agent/soloExecutor将不会接受新任务。如何处理它的一种方法是soloExecutor在 Agent 类中重新分配 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 中制作东西。最好不要丢失您未来的参考资料。

于 2014-01-28T06:45:00.397 回答