什么是 Clojure 惯用的方法来创建一个线程,该线程在后台循环更新某些共享引用并管理其生命周期?我发现自己在使用 future
为此,但感觉有点像黑客,因为我从不返回有意义的值。例如。:
(future (loop [] (do
(Thread/sleep 100)
(dosync (...))
(recur))))
另外,我要小心
future-cancel
当不再需要后台处理时。关于如何在 Clojure/Swing 应用程序中进行编排的任何提示都会很好。例如。一个假人 JComponent
添加到我的 UI 中负责在窗口关闭时终止线程可能是一个想法。
最佳答案
您不需要 do
在你的循环中;这是暗示。此外,虽然无条件循环重复没有任何问题,但您也可以使用 (while true ...)。future
是一个很好的工具;不要因为永远得不到返回而烦恼。但是,如果您使用代理而不是 future ,那真的会困扰您 - 没有值(value)观的代理是疯狂的。
然而,谁说你需要future-cancel
?只需让您将来的步骤之一是检查它是否仍然需要。那么你的代码的其他部分就不需要跟踪 future 并决定何时取消它们。所以像
(future (loop []
(Thread/sleep 100)
(when (dosync
(alter some-value some-function))
(recur)) ; quit if alter returns nil
))
将是一个可行的方法。
关于multithreading - 生成和管理后台线程的惯用 Clojure 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5291436/