Future is done at the time addListener is called, addListener will execute the listener inline.Future is not yet done, addListener will schedule the listener to be run by the thread that completes the input Future, which may be an internal system thread such as an RPC network thread.