@Override public final void dispose() { Future<?> f = get(); if (f != FINISHED && f != DISPOSED) { if (compareAndSet(f, DISPOSED)) { if (f != null) { f.cancel(runner != Thread.currentThread()); } } } }
@Test public void cancelSetFuture() { AbstractDirectTask task = new AbstractDirectTask(Functions.EMPTY_RUNNABLE) { private static final long serialVersionUID = 208585707945686116L; }; final Boolean[] interrupted = { null }; assertFalse(task.isDisposed()); task.dispose(); assertTrue(task.isDisposed()); task.dispose(); assertTrue(task.isDisposed()); FutureTask<Void> ft = new FutureTask<Void>(Functions.EMPTY_RUNNABLE, null) { @Override public boolean cancel(boolean mayInterruptIfRunning) { interrupted[0] = mayInterruptIfRunning; return super.cancel(mayInterruptIfRunning); } }; task.setFuture(ft); assertTrue(interrupted[0]); assertTrue(task.isDisposed()); }
@Test public void finished() { AbstractDirectTask task = new AbstractDirectTask(Functions.EMPTY_RUNNABLE) { private static final long serialVersionUID = 208585707945686116L; }; final Boolean[] interrupted = { null }; FutureTask<Void> ft = new FutureTask<Void>(Functions.EMPTY_RUNNABLE, null) { @Override public boolean cancel(boolean mayInterruptIfRunning) { interrupted[0] = mayInterruptIfRunning; return super.cancel(mayInterruptIfRunning); } }; task.set(AbstractDirectTask.FINISHED); task.setFuture(ft); assertTrue(task.isDisposed()); assertNull(interrupted[0]); task.dispose(); assertTrue(task.isDisposed()); assertNull(interrupted[0]); }
@Override public final boolean isDisposed() { Future<?> f = get(); return f == FINISHED || f == DISPOSED; }
@Override public void run() { task.dispose(); } };
@Override public void run() { task.setFuture(ft); } };
@Test public void setFutureCancel() { AbstractDirectTask task = new AbstractDirectTask(Functions.EMPTY_RUNNABLE) { private static final long serialVersionUID = 208585707945686116L; }; final Boolean[] interrupted = { null }; FutureTask<Void> ft = new FutureTask<Void>(Functions.EMPTY_RUNNABLE, null) { @Override public boolean cancel(boolean mayInterruptIfRunning) { interrupted[0] = mayInterruptIfRunning; return super.cancel(mayInterruptIfRunning); } }; assertFalse(task.isDisposed()); task.setFuture(ft); assertFalse(task.isDisposed()); task.dispose(); assertTrue(task.isDisposed()); assertTrue(interrupted[0]); } @Test
@Test public void finishedCancel() { AbstractDirectTask task = new AbstractDirectTask(Functions.EMPTY_RUNNABLE) { private static final long serialVersionUID = 208585707945686116L; }; final Boolean[] interrupted = { null }; FutureTask<Void> ft = new FutureTask<Void>(Functions.EMPTY_RUNNABLE, null) { @Override public boolean cancel(boolean mayInterruptIfRunning) { interrupted[0] = mayInterruptIfRunning; return super.cancel(mayInterruptIfRunning); } }; task.set(AbstractDirectTask.FINISHED); assertTrue(task.isDisposed()); task.dispose(); assertTrue(task.isDisposed()); task.setFuture(ft); assertTrue(task.isDisposed()); assertNull(interrupted[0]); assertTrue(task.isDisposed()); assertNull(interrupted[0]); }
@Override public final boolean isDisposed() { Future<?> f = get(); return f == FINISHED || f == DISPOSED; }
@Override public final void dispose() { Future<?> f = get(); if (f != FINISHED && f != DISPOSED) { if (compareAndSet(f, DISPOSED)) { if (f != null) { f.cancel(runner != Thread.currentThread()); } } } }
@Test public void cancelSetFutureCurrentThread() { AbstractDirectTask task = new AbstractDirectTask(Functions.EMPTY_RUNNABLE) { private static final long serialVersionUID = 208585707945686116L; }; final Boolean[] interrupted = { null }; assertFalse(task.isDisposed()); task.runner = Thread.currentThread(); task.dispose(); assertTrue(task.isDisposed()); task.dispose(); assertTrue(task.isDisposed()); FutureTask<Void> ft = new FutureTask<Void>(Functions.EMPTY_RUNNABLE, null) { @Override public boolean cancel(boolean mayInterruptIfRunning) { interrupted[0] = mayInterruptIfRunning; return super.cancel(mayInterruptIfRunning); } }; task.setFuture(ft); assertFalse(interrupted[0]); assertTrue(task.isDisposed()); }
@Override public final boolean isDisposed() { Future<?> f = get(); return f == FINISHED || f == DISPOSED; }
@Override public final void dispose() { Future<?> f = get(); if (f != FINISHED && f != DISPOSED) { if (compareAndSet(f, DISPOSED)) { if (f != null) { f.cancel(runner != Thread.currentThread()); } } } }
@Test public void setFutureCancelSameThread() { AbstractDirectTask task = new AbstractDirectTask(Functions.EMPTY_RUNNABLE) { private static final long serialVersionUID = 208585707945686116L; }; final Boolean[] interrupted = { null }; FutureTask<Void> ft = new FutureTask<Void>(Functions.EMPTY_RUNNABLE, null) { @Override public boolean cancel(boolean mayInterruptIfRunning) { interrupted[0] = mayInterruptIfRunning; return super.cancel(mayInterruptIfRunning); } }; assertFalse(task.isDisposed()); task.setFuture(ft); task.runner = Thread.currentThread(); assertFalse(task.isDisposed()); task.dispose(); assertTrue(task.isDisposed()); assertFalse(interrupted[0]); }
public final void setFuture(Future<?> future) { for (;;) { Future<?> f = get(); if (f == FINISHED) { break; } if (f == DISPOSED) { future.cancel(runner != Thread.currentThread()); break; } if (compareAndSet(f, future)) { break; } } } }
public final void setFuture(Future<?> future) { for (;;) { Future<?> f = get(); if (f == FINISHED) { break; } if (f == DISPOSED) { future.cancel(runner != Thread.currentThread()); break; } if (compareAndSet(f, future)) { break; } } } }
public final void setFuture(Future<?> future) { for (;;) { Future<?> f = get(); if (f == FINISHED) { break; } if (f == DISPOSED) { future.cancel(runner != Thread.currentThread()); break; } if (compareAndSet(f, future)) { break; } } } }