当我在 emacs 中从 Swank repl 运行 Clojure 代码时,主线程将使用 printf 将消息打印到 repl。但是,如果我运行代理或显式创建也打印的其他线程,有时输出不会显示,有时它会显示在我正在运行 Swank 的控制台窗口中。我很想知道为什么。
编辑:感谢丹尼尔在下面的回答,我现在知道其他线程没有绑定到 REPL 的输出。此代码有效,因为您从运行的地方传入out。然而我的新问题是,这段代码现在每个线程都阻塞,所以它不是并行运行,而是一次运行每个线程,所以我需要一个更能感知线程的输出方法。
(defn sleeper-thread [out id t]
"Sleep for time T ms"
(binding [*out* out]
(printf "%d sleeping for time %d\n" id t)
(Thread/sleep t)
(printf "%d slept\n" id)))
(defn test-threads [n out]
(dotimes [x n]
(.start (Thread. (#(sleeper-thread %1 %2 %3) out x (+ 2000 (rand-int 5000)))))))