--- jsr166/src/test/tck/CompletableFutureTest.java 2016/01/23 20:02:48 1.139 +++ jsr166/src/test/tck/CompletableFutureTest.java 2016/04/09 19:10:13 1.144 @@ -3295,7 +3295,7 @@ public class CompletableFutureTest exten () -> f.obtrudeException(null), () -> CompletableFuture.delayedExecutor(1L, SECONDS, null), - () -> CompletableFuture.delayedExecutor(1L, null, new ThreadExecutor()), + () -> CompletableFuture.delayedExecutor(1L, null, exec), () -> CompletableFuture.delayedExecutor(1L, null), () -> f.orTimeout(1L, null), @@ -3925,6 +3925,38 @@ public class CompletableFutureTest exten Monad.plus(godot, Monad.unit(5L))); } + /** + * A single CompletableFuture with many dependents. + * A demo of scalability - runtime is O(n). + */ + public void testManyDependents() throws Throwable { + final int n = 1_000; + final CompletableFuture head = new CompletableFuture<>(); + final CompletableFuture complete = CompletableFuture.completedFuture((Void)null); + final AtomicInteger count = new AtomicInteger(0); + for (int i = 0; i < n; i++) { + head.thenRun(() -> count.getAndIncrement()); + head.thenAccept((x) -> count.getAndIncrement()); + head.thenApply((x) -> count.getAndIncrement()); + + head.runAfterBoth(complete, () -> count.getAndIncrement()); + head.thenAcceptBoth(complete, (x, y) -> count.getAndIncrement()); + head.thenCombine(complete, (x, y) -> count.getAndIncrement()); + complete.runAfterBoth(head, () -> count.getAndIncrement()); + complete.thenAcceptBoth(head, (x, y) -> count.getAndIncrement()); + complete.thenCombine(head, (x, y) -> count.getAndIncrement()); + + head.runAfterEither(new CompletableFuture(), () -> count.getAndIncrement()); + head.acceptEither(new CompletableFuture(), (x) -> count.getAndIncrement()); + head.applyToEither(new CompletableFuture(), (x) -> count.getAndIncrement()); + new CompletableFuture().runAfterEither(head, () -> count.getAndIncrement()); + new CompletableFuture().acceptEither(head, (x) -> count.getAndIncrement()); + new CompletableFuture().applyToEither(head, (x) -> count.getAndIncrement()); + } + head.complete(null); + assertEquals(5 * 3 * n, count.get()); + } + // static U join(CompletionStage stage) { // CompletableFuture f = new CompletableFuture<>(); // stage.whenComplete((v, ex) -> {