用于生成和管理后台线程的惯用Clojure方法

pau*_*doo 15 swing multithreading dispose clojure ownership

什么是惯用的Clojure方法来创建一个在后台循环的线程,对一些共享引用进行更新并管理它的生命周期?我发现自己正在使用future它,但感觉有点像黑客,因为我永远不会返回有意义的价值.例如:

(future (loop [] (do
    (Thread/sleep 100)
    (dosync (...))
    (recur))))
Run Code Online (Sandbox Code Playgroud)

此外,future-cancel当不再需要后台处理时,我需要小心这一点.关于如何在Clojure/Swing应用程序中编排它的任何提示都会很好.例如JComponent,添加到我的UI中的虚拟对象,当窗口关闭时负责杀死线程可能是一个想法.

ama*_*loy 9

你不需要do循环; 这是隐含的.而且,虽然无条件循环重复没有任何问题,但您也可以使用(而真正的......).

future是一个很好的工具; 不要让你觉得你永远不会得到回报.如果你使用代理而不是未来,那真的会让你感到烦恼,不过没有价值观的代理人就是疯了.

但是,谁说你需要future-cancel?只需在将来的一个步骤中检查是否仍然需要它.然后,您的代码中没有其他部分需要跟踪期货并决定何时取消它们.所以像

(future (loop []
          (Thread/sleep 100)
          (when (dosync
                 (alter some-value some-function))
            (recur)) ; quit if alter returns nil
          ))
Run Code Online (Sandbox Code Playgroud)

将是一个可行的方法.