你被串联起来,完成建模阶段的依赖性。如果您将两个动作A
和B
到另一个动作C
,您定义的关系A → C
和B → C
,但A
和B
,因此没有关系,没有关系,包括没有排序关系,他们之间,换句话说,你可以“吨甚至认为对方后一个将运行,即
CompletableFuture<String> base=CompletableFuture.supplyAsync(() -> {
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
return "source";
});
base.thenAccept(s -> {
System.out.println("entered first consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving first consumer");
});
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
base.thenAccept(s -> {
System.out.println("entered second consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving second consumer");
});
很可能会打印类似
entered first consumer in Thread[ForkJoinPool.commonPool-worker-1,5,main]
entered second consumer in Thread[main,5,main]
leaving second consumer
leaving first consumer
虽然,当然,也没有关于它的担保。
为了强制您在两个消费者之间的依赖关系,您必须适当链接它们,例如,
CompletableFuture<String> base=CompletableFuture.supplyAsync(() -> {
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
return "source";
});
CompletableFuture<Void> next = base.thenAccept(s -> {
System.out.println("entered first consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving first consumer");
});
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
base.thenAcceptBoth(next, (s,ignored) -> {
System.out.println("entered second consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving second consumer");
}).join();
这里,第二消费者被链接到base
和next
,从base
接受的结果,而是取决于next
的完成(你通常如果没有结果传递也许不会要求如果你有这种情况,你想重新考虑你的设计)。
或者,也可以将所述第一Consumer
到Function
穿过值,这样就可以通过连锁thenApply
它,以允许链接另一个thenAccept
阶段到它。
“thenAccept”表示首先完成“this”CompletableFuture,然后才执行参数函数。 –