当我在emacs的Swank repl中运行Clojure代码时,主线程将使用printf向repl打印出消息。但是,如果我运行代理或显式创建其他线程,这些线程也会打印输出,有时输出不会显示出来,有时则会显示在运行Swank的控制台窗口中。我很想了解原因。
编辑:由于Daniel下面的答案,我现在知道其他线程没有将out绑定到REPL的输出上。此代码之所以有效,是因为您从运行它的位置传递了out。然而,我的新问题是,这段代码现在会阻塞每个线程,因此不是并行运行每个线程,而是一个接一个地运行每个线程,因此我需要一种更加线程感知的输出方法。
编辑:由于Daniel下面的答案,我现在知道其他线程没有将out绑定到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)))))))
future
:也许我在这里使用不当,因为它在另一个线程中评估其主体并缓存结果,因此在具有副作用的代码中使用它可能不是最好的选择,但那只是为了测试当我正在尝试*out*
时... - danlei