当前位置: 首页 > 面试题库 >

嵌套期货不执行

狄宗清
2023-03-14
问题内容

我遇到了一个奇怪的情况。我CompletableFuture不满意,运行以下代码时出现意外结果:

public static void main(String[] args) {     
    CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<Object>>>>>> completableFutureCompletableFuture = CompletableFuture.supplyAsync(() -> {
        System.out.println("first");
        return CompletableFuture.supplyAsync(() -> {
            System.out.println("second");
            return CompletableFuture.supplyAsync(() -> {
                System.out.println("third");
                return CompletableFuture.supplyAsync(() -> {
                    System.out.println("fourth");
                    return CompletableFuture.supplyAsync(() -> {
                        System.out.println("fifth");
                        return CompletableFuture.completedFuture(null);
                    });
                });
            });
        });
    });

   completableFutureCompletableFuture.get();
}

没有抛出异常(即使使用exceptionally),我看到的是控制台输出为

first
second
third // appears sometimes

现在,很明显,此代码没有实际的生产价值,但这是一种情况的表示,其中您的代码具有未知数量的嵌套,其中每个嵌套或其中的一些嵌套CompleteableFutures将无法执行。

任何解释(以及有关如何修复的示例)将不胜感激


问题答案:

之所以不起作用,是因为在您的简单测试中,VM在所有任务完成之前就退出了。

当您致电时,保证completableFutureCompletableFuture.get()仅完成了期货的第一期嵌套。VM退出,所有线程被杀死。

换句话说,第一个嵌套的将来可能仍然“未完成”,因为它的线程可能仍然很忙。但是,当您尝试获得其结果时,get它当然会等到完成后才能按预期工作。试一试:

completableFutureCompletableFuture.get().get().get().get().get()

…然后您强迫所有期货都已完成,并且一切都按预期进行。



 类似资料:
  • 我想创建一个函数来返回成功操作的一系列期货的结果。我遇到的问题是返回类型为Unit,并且未来函数正在完成,而无需等待嵌套的未来序列完成。我尝试过不使用on完成函数,而是使用map或平面图,但没有成功。我还想避免使用wait 这个后来会这么叫

  • 我有一组Future[T],我想将其管理到我正在编写的库的单个对象中。在我当前的实现中,我使用的是未来。按顺序收集它们,并等待它们解决,这样我就可以对它们做未来的事情(映射、收集、过滤)。然而,这只会让我有能力在成功或失败时进行匹配,这不一定是我正在处理的期货集合的情况。有些会失败,有些会成功,我希望能够从成功者中提取出我能提取的值,并收集其他人的异常和错误,以便我能够适当地升级它们。在伪代码中,

  • 我有以下三张桌子 教室 注册学生 iduser_idclass_id 帖子 模型 Classroom.php 注册学生。php 邮递php 现在我需要获得某个班级的所有帖子,学生在该班级注册。 例如,一名学生注册了教室表中id号为1的班级。所以在registered_students表中会注意到,这个特定的用户是在这个特定的类下注册的。每个类在post表中可能有多个post。用户需要获得他类的所有

  • 假设我有一个抽象的“生产者”实例: 我需要对它产生的每个(或一些)对象进行一些处理。所以,我做了类似的事情: …并以<code>Future[Seq[Future[T]]]结束。这没关系,但有点麻烦。我想摆脱外部的,只需要就可以了,但我想不出一个(非阻塞)转换,可以让我这样做。 有什么想法吗?

  • 我有一个可完成期货的列表,我想从第一个期货开始,如果有任何完成例外,我想尝试列表中的下一个期货,依此类推,直到我耗尽了我所有的期货。如果任何一个期货成功了,我想就此止步,而不使用列表中的下一个期货。我如何做到这一点?到目前为止,我已经尝试过: 但是当我测试这种方法时,我看到当未来完成失败时,会抛出异常,并且不会尝试下一组期货。 编辑: 这就是样本的样子

  • 本文向大家介绍shell中嵌套执行expect命令实例,包括了shell中嵌套执行expect命令实例的使用技巧和注意事项,需要的朋友参考一下 一直都想把expect的操作写到bash脚本里,这样就不用我再写两个脚本来执行了,搞了一下午终于有点小成就,给大家看看吧. 系统:centos 5.x 1.先安装expect 2.脚本内容: 这样写的话,就方便得很多,一个脚本就包括完了.