/** * Creates a future that completes when the first future completes either normally * or exceptionally. Cancellation of the future propagates to the supplied futures. */ public static <V> ListenableFuture<V> whenAnyComplete(Iterable<? extends ListenableFuture<? extends V>> futures) { requireNonNull(futures, "futures is null"); checkArgument(!isEmpty(futures), "futures is empty"); ExtendedSettableFuture<V> firstCompletedFuture = ExtendedSettableFuture.create(); for (ListenableFuture<? extends V> future : futures) { firstCompletedFuture.setAsync(future); } return firstCompletedFuture; }
/** * Creates a future that completes when the first future completes either normally * or exceptionally. Cancellation of the future propagates to the supplied futures. */ public static <V> ListenableFuture<V> whenAnyComplete(Iterable<? extends ListenableFuture<? extends V>> futures) { requireNonNull(futures, "futures is null"); checkArgument(!isEmpty(futures), "futures is empty"); ExtendedSettableFuture<V> firstCompletedFuture = ExtendedSettableFuture.create(); for (ListenableFuture<? extends V> future : futures) { firstCompletedFuture.setAsync(future); } return firstCompletedFuture; }
@Test public void testSet() throws Exception { ExtendedSettableFuture<String> future = ExtendedSettableFuture.create(); future.set("abc"); assertTrue(future.isDone()); assertFalse(future.isCancelled()); assertFalse(future.checkWasInterrupted()); assertEquals(future.get(), "abc"); }
@Test public void propagateCancellationWithoutInterrupt() throws Exception { // Test interrupt override ExtendedSettableFuture<Object> fromFuture = ExtendedSettableFuture.create(); ExtendedSettableFuture<Object> toFuture = ExtendedSettableFuture.create(); propagateCancellation(fromFuture, toFuture, false); fromFuture.cancel(true); assertTrue(toFuture.isCancelled()); assertFalse(toFuture.checkWasInterrupted()); fromFuture = ExtendedSettableFuture.create(); toFuture = ExtendedSettableFuture.create(); propagateCancellation(fromFuture, toFuture, false); fromFuture.cancel(false); assertTrue(toFuture.isCancelled()); assertFalse(toFuture.checkWasInterrupted()); }
@Test public void propagateCancellationWithInterrupt() throws Exception { ExtendedSettableFuture<Object> fromFuture = ExtendedSettableFuture.create(); ExtendedSettableFuture<Object> toFuture = ExtendedSettableFuture.create(); propagateCancellation(fromFuture, toFuture, true); fromFuture.cancel(true); assertTrue(toFuture.isCancelled()); assertTrue(toFuture.checkWasInterrupted()); // Test interrupt override fromFuture = ExtendedSettableFuture.create(); toFuture = ExtendedSettableFuture.create(); propagateCancellation(fromFuture, toFuture, true); fromFuture.cancel(false); assertTrue(toFuture.isCancelled()); assertTrue(toFuture.checkWasInterrupted()); }
@Test public void testSet() throws Exception { ExtendedSettableFuture<String> future = ExtendedSettableFuture.create(); future.set("abc"); assertTrue(future.isDone()); assertFalse(future.isCancelled()); assertFalse(future.checkWasInterrupted()); assertEquals(future.get(), "abc"); }
@Test public void testSetException() throws Exception { ExtendedSettableFuture<String> future = ExtendedSettableFuture.create(); future.setException(new Exception("")); assertTrue(future.isDone()); assertFalse(future.isCancelled()); assertFalse(future.checkWasInterrupted()); assertThrows(ExecutionException.class, future::get); }
@Test public void testSetException() throws Exception { ExtendedSettableFuture<String> future = ExtendedSettableFuture.create(); future.setException(new Exception("")); assertTrue(future.isDone()); assertFalse(future.isCancelled()); assertFalse(future.checkWasInterrupted()); assertThrows(ExecutionException.class, future::get); }
@Test public void propagateCancellationWithoutInterrupt() throws Exception { // Test interrupt override ExtendedSettableFuture<Object> fromFuture = ExtendedSettableFuture.create(); ExtendedSettableFuture<Object> toFuture = ExtendedSettableFuture.create(); propagateCancellation(fromFuture, toFuture, false); fromFuture.cancel(true); assertTrue(toFuture.isCancelled()); assertFalse(toFuture.checkWasInterrupted()); fromFuture = ExtendedSettableFuture.create(); toFuture = ExtendedSettableFuture.create(); propagateCancellation(fromFuture, toFuture, false); fromFuture.cancel(false); assertTrue(toFuture.isCancelled()); assertFalse(toFuture.checkWasInterrupted()); }
@Test public void propagateCancellationWithInterrupt() throws Exception { ExtendedSettableFuture<Object> fromFuture = ExtendedSettableFuture.create(); ExtendedSettableFuture<Object> toFuture = ExtendedSettableFuture.create(); propagateCancellation(fromFuture, toFuture, true); fromFuture.cancel(true); assertTrue(toFuture.isCancelled()); assertTrue(toFuture.checkWasInterrupted()); // Test interrupt override fromFuture = ExtendedSettableFuture.create(); toFuture = ExtendedSettableFuture.create(); propagateCancellation(fromFuture, toFuture, true); fromFuture.cancel(false); assertTrue(toFuture.isCancelled()); assertTrue(toFuture.checkWasInterrupted()); }
@Test public void testCancelWithoutInterrupt() throws Exception { ExtendedSettableFuture<String> future = ExtendedSettableFuture.create(); future.cancel(false); assertTrue(future.isDone()); assertTrue(future.isCancelled()); assertFalse(future.checkWasInterrupted()); assertThrows(CancellationException.class, future::get); }
@Test public void testCancelWithInterrupt() throws Exception { ExtendedSettableFuture<String> future = ExtendedSettableFuture.create(); future.cancel(true); assertTrue(future.isDone()); assertTrue(future.isCancelled()); assertTrue(future.checkWasInterrupted()); assertThrows(CancellationException.class, future::get); }
@Test public void testCancelWithoutInterrupt() throws Exception { ExtendedSettableFuture<String> future = ExtendedSettableFuture.create(); future.cancel(false); assertTrue(future.isDone()); assertTrue(future.isCancelled()); assertFalse(future.checkWasInterrupted()); assertThrows(CancellationException.class, future::get); }
@Test public void testCancelWithInterrupt() throws Exception { ExtendedSettableFuture<String> future = ExtendedSettableFuture.create(); future.cancel(true); assertTrue(future.isDone()); assertTrue(future.isCancelled()); assertTrue(future.checkWasInterrupted()); assertThrows(CancellationException.class, future::get); }
ExtendedSettableFuture<String> fromFuture = ExtendedSettableFuture.create(); ExtendedSettableFuture<String> toFuture = ExtendedSettableFuture.create(); toFuture.setAsync(fromFuture); fromFuture.set("abc"); fromFuture = ExtendedSettableFuture.create(); toFuture = ExtendedSettableFuture.create(); toFuture.setAsync(fromFuture); fromFuture.setException(new RuntimeException()); fromFuture = ExtendedSettableFuture.create(); toFuture = ExtendedSettableFuture.create(); toFuture.setAsync(fromFuture); toFuture.cancel(false); fromFuture = ExtendedSettableFuture.create(); toFuture = ExtendedSettableFuture.create(); toFuture.setAsync(fromFuture); toFuture.cancel(true);
ExtendedSettableFuture<String> fromFuture = ExtendedSettableFuture.create(); ExtendedSettableFuture<String> toFuture = ExtendedSettableFuture.create(); toFuture.setAsync(fromFuture); fromFuture.set("abc"); fromFuture = ExtendedSettableFuture.create(); toFuture = ExtendedSettableFuture.create(); toFuture.setAsync(fromFuture); fromFuture.setException(new RuntimeException()); fromFuture = ExtendedSettableFuture.create(); toFuture = ExtendedSettableFuture.create(); toFuture.setAsync(fromFuture); toFuture.cancel(false); fromFuture = ExtendedSettableFuture.create(); toFuture = ExtendedSettableFuture.create(); toFuture.setAsync(fromFuture); toFuture.cancel(true);
ExtendedSettableFuture<String> fromFuture = ExtendedSettableFuture.create(); SettableFuture<String> toFuture = SettableFuture.create(); mirror(fromFuture, toFuture, true); fromFuture = ExtendedSettableFuture.create(); toFuture = SettableFuture.create(); mirror(fromFuture, toFuture, true); fromFuture = ExtendedSettableFuture.create(); toFuture = SettableFuture.create(); mirror(fromFuture, toFuture, false); fromFuture = ExtendedSettableFuture.create(); toFuture = SettableFuture.create(); mirror(fromFuture, toFuture, true);
ExtendedSettableFuture<String> fromFuture = ExtendedSettableFuture.create(); SettableFuture<String> toFuture = SettableFuture.create(); mirror(fromFuture, toFuture, true); fromFuture = ExtendedSettableFuture.create(); toFuture = SettableFuture.create(); mirror(fromFuture, toFuture, true); fromFuture = ExtendedSettableFuture.create(); toFuture = SettableFuture.create(); mirror(fromFuture, toFuture, false); fromFuture = ExtendedSettableFuture.create(); toFuture = SettableFuture.create(); mirror(fromFuture, toFuture, true);