在clojure中,您可以创建SwingWorker代理并实现doInBackground并执行方法。你会如何继续调用swingworker的执行方法?
答案 0 :(得分:2)
您可以使用标准Java互操作创建和调用SwingWorker,例如:
;; define a proxy that extends SwingWorker
(def my-swing-worker
(proxy [SwingWorker] []
(doInBackground []
(reduce + (range 1000000)))))
;; run the SwingWorker
(.execute my-swing-worker)
;; Get the result
(.get my-swing-worker)
=> 499999500000
但是,通常在Clojure中你不会直接使用SwingWorkers。 Clojure中已经有一个功能可以提供SwingWorker的功能: future 使用一个单独的线程来计算长时间运行的任务,并允许您稍后获得结果。用法示例:
;; define and launch a future
(def my-future
(future
(reduce + (range 1000000))))
;; get the result (will wait for future to complete if needed)
@my-future
=> 499999500000
我认为大多数人会同意“纯粹的Clojure”方式更简单,更适合运行后台任务。我可以想到更喜欢SwingWorker的唯一原因是你使用它提供的一些特定的GUI集成功能(例如,触发属性更改事件的能力)。