package org.jactr.core.concurrent; /* * default logging */ import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.FutureTask; public class ListenableFuture<C> extends FutureTask<C> { Collection<IListenableFutureListener<C>> _listeners = new ArrayList<IListenableFutureListener<C>>(); public ListenableFuture(Runnable runner) { super(runner, null); } /** * set the result or exception on this future, releasing any blocking * {@link #get()} calls * * @param result * @param thrown */ public void set(C result, Throwable thrown) { if (thrown != null) setException(thrown); set(result); } @Override protected void setException(Throwable thrown) { super.setException(thrown); for (IListenableFutureListener<C> listener : _listeners) listener.exception(this); } @Override protected void set(C result) { super.set(result); for (IListenableFutureListener<C> listener : _listeners) listener.done(this); } @Override public boolean cancel(boolean mayInterrupt) { boolean rtn = super.cancel(mayInterrupt); if (rtn) for (IListenableFutureListener<C> listener : _listeners) listener.canceled(this); return rtn; } public void add(IListenableFutureListener<C> listener) { _listeners.add(listener); } public void remove(IListenableFutureListener<C> listener) { _listeners.remove(listener); } }