Is there a way to be notified when a clojure future finishes?

You can start another task that watches the future and then runs the function. In this case I'll just use another future. Which wraps up nicely into a when-done function:

user=> (defn when-done [future-to-watch function-to-call] 
          (future (function-to-call @future-to-watch)))
user=> (def meaning-of-the-universe 
         (let [f (future (Thread/sleep 10000) 42)] 
            (when-done f #(println "future available and the answer is:" %)) 
            f))
#'user/meaning-of-the-universe

... waiting ...

user=> future available and the answer is: 42
user=> @meaning-of-the-universe
42

I found this thread on google which looks interesting:

https://groups.google.com/forum/?fromgroups=#!topic/clojure-dev/7BKQi9nWwAw

http://dev.clojure.org/display/design/Promises

https://github.com/stuartsierra/cljque/blob/master/src/cljque/promises.clj


For very simple cases: If you dont want to block and dont care about the result just add the callback in the future definition.

(future (a-taking-time-computation) (the-callback))

If you care about the result use comp with the call back

(future (the-callback (a-taking-time-computation)))

or

(future (-> input a-taking-time-computation callback))

Semantically speaking the java equivalent code would be:

final MyCallBack callbackObj = new MyCallBack();
new Thread() {
     public void run() {
         a-taking-time-computation();
         callbackObj.call();
     }
 }.start()

For complex cases you may want to look:

https://github.com/ztellman/manifold

https://github.com/clojure/core.async

Tags:

Clojure