/** * Starts execution of task if it has not already started. This is thread safe, and will ensure * that execution will only occur once. */ protected void executeIfNotStarted() { if (! executionStarted.get() && executionStarted.compareAndSet(false, true)) { super.run(); } }
/** * Starts execution of task if it has not already started. This is thread safe, and will ensure * that execution will only occur once. */ protected void executeIfNotStarted() { if (! executionStarted.get() && executionStarted.compareAndSet(false, true)) { super.run(); } }
@Override public void run() { // must check if canceled before we run, otherwise we can't transition the state if (f.isCancelled()) { super.cancel(false); } super.run(); } }
@Override public void run() { // must check if canceled before we run, otherwise we can't transition the state if (f.isCancelled()) { super.cancel(false); } super.run(); } }
@Override public <T> ListenableFuture<T> makeWithResult(T result) { ListenableFutureTask<T> lft = new ExecuteOnGetFutureTask<>(() -> result); lft.run(); return lft; } }
@Override public <T> ListenableFuture<T> makeWithResult(T result) { ListenableFutureTask<T> lft = new ListenableFutureTask<>(false, () -> result); lft.run(); return lft; } }
@Override public ListenableFuture<Object> makeWithFailure(Exception e) { ListenableFutureTask<Object> lft = new ListenableFutureTask<>(false, () -> { throw e; }); lft.run(); return lft; }
@Override public ListenableFuture<Object> makeWithFailure(Exception t) { ListenableFutureTask<Object> lft = new ExecuteOnGetFutureTask<>(() -> { throw t; }); lft.run(); return lft; }
@Test (expected = ExecutionException.class) public void getExecutionExceptionTest() throws InterruptedException, ExecutionException { TestRunnable tr = new TestRuntimeFailureRunnable(); ListenableFutureTask<Object> future = makeFutureTask(tr, null); future.run(); future.get(); }
@Test (expected = ExecutionException.class) public void getWithTimeoutExecutionExceptionTest() throws InterruptedException, ExecutionException, TimeoutException { TestRunnable tr = new TestRuntimeFailureRunnable(); ListenableFutureTask<Object> future = makeFutureTask(tr, null); future.run(); future.get(100, TimeUnit.MILLISECONDS); }
@Test public void listenerExceptionAddBeforeRunTest() { TestRunnable listener = new TestRuntimeFailureRunnable(); ListenableFutureTask<Object> future = makeFutureTask(DoNothingRunnable.instance(), null); future.addListener(listener); future.run(); assertTrue(listener.ranOnce()); }
@Test public void listenerExceptionAddAfterRunTest() { TestRunnable listener = new TestRuntimeFailureRunnable(); ListenableFutureTask<Object> future = makeFutureTask(DoNothingRunnable.instance(), null); future.run(); try { future.addListener(listener); fail("Exception should have thrown"); } catch (RuntimeException e) { // expected } assertTrue(listener.ranOnce()); }
@Test public void cancelFlatMappedAsyncFutureTest() { ListenableFutureTask<Object> future = makeFutureTask(DoNothingRunnable.instance(), null); SettableListenableFuture<Void> asyncSLF = new SettableListenableFuture<>(); ListenableFuture<Void> mappedLF = future.flatMap(asyncSLF); future.run(); // complete source future before cancel assertFalse(mappedLF.isDone()); assertTrue(mappedLF.cancel(false)); // no interrupt needed, delegate future not started assertTrue(asyncSLF.isCancelled()); }
@Test public void addCallbackExecutionExceptionTest() { RuntimeException failure = new SuppressedStackRuntimeException(); ListenableFutureTask<Object> future = makeFutureTask(new TestRuntimeFailureRunnable(failure), null); TestFutureCallback tfc = new TestFutureCallback(); future.addCallback(tfc); assertEquals(0, tfc.getCallCount()); future.run(); assertEquals(1, tfc.getCallCount()); assertTrue(failure == tfc.getLastFailure()); }
@Test public void addCallbackTest() { TestCallable tc = new TestCallable(); ListenableFutureTask<Object> future = makeFutureTask(tc); TestFutureCallback tfc = new TestFutureCallback(); future.addCallback(tfc); assertEquals(0, tfc.getCallCount()); future.run(); assertEquals(1, tfc.getCallCount()); assertTrue(tc.getReturnedResult() == tfc.getLastResult()); }
future.run(); // this should call the listener