multithreading - 生成和管理后台线程的惯用 Clojure 方式

标签 multithreading swing clojure dispose ownership

什么是 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/

相关文章:

c++ - 在另一个线程中创建 QNetworkAccessManager

c - pthreads/等待(&状态)

java - JComboBox 让 GUI 消失

java - Clojure 与 Var.intern 和 RT.var 的怪异

parsing - Clojure 代码解析器

data-structures - 在 Clojure 中嵌套 map 的惯用方法是什么

java - 如何在Spring Web Service中实现计划任务?

java - 从单独的 JForm 访问 JComboBox 数据

java - 单击按钮加载 JList

java - 等待具有相同服务的其他线程达到某个点