Вы можете создавать и вызывать SwingWorker с помощью стандартного взаимодействия Java, например:
;; 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, заключается в том, что вы используете некоторые из специальных функций интеграции графического интерфейса, которые он предоставляет (например, возможность вызывать события изменения свойств).