/** * {@inheritDoc} * * @since 10.0 */ @Override public void addListener(@Nonnull Runnable listener, @Nonnull Executor executor) { Preconditions.checkNotNull(listener, "Runnable was null."); Preconditions.checkNotNull(executor, "Executor was null."); Listener oldHead = listeners; if (oldHead != Listener.TOMBSTONE) { Listener newNode = new Listener(listener, executor); do { newNode.next = oldHead; if (ATOMIC_HELPER.casListeners(this, oldHead, newNode)) { return; } oldHead = listeners; // re-read } while (oldHead != Listener.TOMBSTONE); } // If we get here then the Listener TOMBSTONE was set, which means the future is done, call // the listener. executeListener(listener, executor); }