2014-01-28 31 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