0

我想用 clojure boot 启动一个必须继续运行的服务器。所以我制作了一个-main函数,以便我可以运行./build.boot并执行主函数。在 main 函数中,我启动一个非守护线程,只要有一个非守护线程,JVM 就会继续运行。但是,引导脚本停止,我的服务器也停止了。我究竟做错了什么?

#!/usr/bin/env boot

(defn -main [& args]
  (let [t (Thread. #(loop []
                      (println (java.util.Date.))
                      (Thread/sleep 500)
                      (recur)))]
    (.setDaemon t false)
    (.start t)
    (Thread/sleep 3000)
    (println "I have started a non-daemon thread, but still I exit???")))

输出

#inst "2016-06-23T08:39:23.453-00:00"
#inst "2016-06-23T08:39:24.005-00:00"
#inst "2016-06-23T08:39:24.507-00:00"
#inst "2016-06-23T08:39:25.009-00:00"
#inst "2016-06-23T08:39:25.511-00:00"
#inst "2016-06-23T08:39:26.013-00:00"
I have started a non-daemon thread, but still I exit???

之后脚本结束。

4

1 回答 1

1

我猜System/exit任务完成后启动调用(它们的函数调用结束)。

您需要将任务修改join为生成的线程,以便在生成的线程-main尚未完成之前该函数不会完成:

(.join t)

于 2016-06-23T08:55:50.750 回答