@Override public boolean isDisposed() { Future<?> f = get(); return f == null || f.isDone(); }
@Override public void dispose() { Future<?> f = getAndSet(null); if (f != null) { f.cancel(allowInterrupt); } } }
@Test public void normalDone() { FutureTask<Object> ft = new FutureTask<Object>(Functions.EMPTY_RUNNABLE, null); FutureDisposable d = new FutureDisposable(ft, false); assertFalse(d.isDisposed()); assertFalse(d.isDisposed()); ft.run(); assertTrue(d.isDisposed()); } }
/** * Construct a Disposable by wrapping a Future that is * cancelled exactly once when the Disposable is disposed. * @param future the Future to wrap * @param allowInterrupt if true, the future cancel happens via Future.cancel(true) * @return the new Disposable instance */ @NonNull public static Disposable fromFuture(@NonNull Future<?> future, boolean allowInterrupt) { ObjectHelper.requireNonNull(future, "future is null"); return new FutureDisposable(future, allowInterrupt); }
/** * Construct a Disposable by wrapping a Future that is * cancelled exactly once when the Disposable is disposed. * @param future the Future to wrap * @param allowInterrupt if true, the future cancel happens via Future.cancel(true) * @return the new Disposable instance */ @NonNull public static Disposable fromFuture(@NonNull Future<?> future, boolean allowInterrupt) { ObjectHelper.requireNonNull(future, "future is null"); return new FutureDisposable(future, allowInterrupt); }
@Override public void dispose() { Future<?> f = getAndSet(null); if (f != null) { f.cancel(allowInterrupt); } } }
@Override public boolean isDisposed() { Future<?> f = get(); return f == null || f.isDone(); }