有没有一种方法可以延迟执行CompletableFuture?

3
我将使用CompletableFuture来进行异步调用。我想知道是否有一种方法可以延迟它的执行。对于一个流程,我有大约5个异步调用,并按需要使用thenApply / thenCompose进行链接。我的问题是当我为调用创建第一个CF时,它会在空闲线程可用时开始执行。我希望首先将所有任务链接起来,然后在调用complete()时开始执行。我正在寻找类似于Java Streams中的中间操作的东西。我关于这个问题曾在SO上得到过一些帮助,但它并没有解决我的问题。
我的技术堆栈只允许使用Java 8,因此无法使用在下一个版本中推出的任何功能。

3
为什么需要延迟? - shmosel
所以将这些部分放在一个列表中,等到你准备好时再组合它们... - shmosel
1
从技术角度来看,它与流不可比较,因为使用流时,每个元素(通常)都是独立处理的,所以在开始迭代之前需要完整的流水线。但对于一个元素来说,没有太大的区别。这就是为什么 Optional 不使用惰性求值的原因。 - shmosel
1
我会尽量详细地解释。所以,我有5个调用(A、B、C、D、E),每个调用都可以重复使用在任何流程中。我计划在一个实用类中定义这些调用的CF,使用像getA()、getB()这样的方法,并根据我的流程重复使用它们。问题是,当我执行getA()时,它将开始执行调用,而我还没有将其链接到其他调用以完成我的流程。在我看来,这不是正确的方式,因为流程尚未完全定义。我只想在CF开始执行时拥有控制权,而这应该是在我完成链接逻辑之后。这有意义吗? - lazyloader
这仍然无法解释为什么需要延迟。对于“CompletableFuture”定义的流程,执行时间完全不相关。 - Holger
显示剩余4条评论
1个回答

6

我还不能写评论,所以我无法请求澄清。如果我理解不正确,请原谅我。据我所知,您基本上只是在寻找一种延迟执行CompletableFuture直到准备好执行的方法。

您是否考虑将另一个CF作为要调用的函数的参数?一旦准备好,只需完成此CF,然后函数就会执行。它大致如下:

CompletableFuture<Void> setup = new CompletableFuture<>();
delayedFunction(setup);

//do whatever you want
System.out.println("foo");

//once you are ready, complete setup to execute the delayed function
setup.complete(null);


public static CompletableFuture<Void> delayedFunction(CompletableFuture<Void> setup) {
  return setup.
    thenAccept(v-> {
      System.out.println("bar");
    });
}

1
这解决了我的目的。有趣的是,在阅读关于CF的内容时,我忽略了最基本的构造函数,而集中精力于链式方法。谢谢Tobias! - lazyloader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接