Java 如何并行运行boolean类型的CompletableFutures,并在所有任务返回TRUE时在第一个假结果或返回时退出?

Java 如何并行运行boolean类型的CompletableFutures,并在所有任务返回TRUE时在第一个假结果或返回时退出?,java,asynchronous,completable-future,Java,Asynchronous,Completable Future,所以我有一个用例,我有四个任务a,B,C,D,我想并行运行。这些任务的响应类型是布尔型的 在并行运行它们之后,我希望在以下任一条件下停止执行 从任何一个任务接收第一个false时返回 这4个任务都已完成,没有一个返回false 我的项目使用Java,springboot 所以我试图用完全期货来实现这一点。我可以用下面的代码来完成第一步。但不是第二步。有什么帮助吗 导入java.util.array; 导入java.util.List; 导入java.util.concurrent.Complet

所以我有一个用例,我有四个任务a,B,C,D,我想并行运行。这些任务的响应类型是布尔型的

在并行运行它们之后,我希望在以下任一条件下停止执行

  • 从任何一个任务接收第一个false时返回
  • 这4个任务都已完成,没有一个返回false
  • 我的项目使用Java,springboot

    所以我试图用完全期货来实现这一点。我可以用下面的代码来完成第一步。但不是第二步。有什么帮助吗

    导入java.util.array;
    导入java.util.List;
    导入java.util.concurrent.CompletableFuture;
    导入java.util.concurrent.CompletionStage;
    导入java.util.function.Consumer;
    导入java.util.function.Predicate;
    公共级康普图{
    公共静态CompletableFuture firstMatchingCondition(
    
    列出创建一个在所有期货完成后将完成的期货,以及一个满足条件后将完成的期货。然后,将它们合并为一个期货,在其中一个完成后将完成:

    CompletableFuture firstFalse=firstMatchingCondition(列表,i->!i);
    完全的未来
    =CompletableFuture.allOf(list.toArray(新的CompletableFuture[0]);
    CompletableFuture.anyOf(firstFalse,all.join();
    
    可以将创建内容内联到单个表达式中

    CompletableFuture.anyOf(
    第一个匹配条件(列表,i->!i),
    CompletableFuture.allOf(list.toArray(新的CompletableFuture[0]))
    ).join();
    

    但重要的是要记住,这只会影响启动线程在继续之前等待的时间。这不会取消其他未来,而且由于
    CompletableFuture
    通常不支持中断,因此无法停止正在进行的评估。只会忽略它们的结果。

    Create当所有期货都完成后,另一个将完成的期货,除了一个满足条件后将完成的期货之外。然后,将它们组合成一个在其中一个完成后将完成的期货:

    CompletableFuture firstFalse=firstMatchingCondition(列表,i->!i);
    完全的未来
    =CompletableFuture.allOf(list.toArray(新的CompletableFuture[0]);
    CompletableFuture.anyOf(firstFalse,all.join();
    
    可以将创建内容内联到单个表达式中

    CompletableFuture.anyOf(
    第一个匹配条件(列表,i->!i),
    CompletableFuture.allOf(list.toArray(新的CompletableFuture[0]))
    ).join();
    
    但重要的是要记住,这只会影响启动线程在继续之前等待的时间。这不会取消其他未来,而且由于
    CompletableFuture
    通常不支持中断,因此无法停止正在进行的评估。只会忽略它们的结果。

    您的失败ure的开头是:“我想在以下任一条件下停止执行”。一旦
    CompletableFuture
    启动,就没有办法停止它。
    CompletableFuture::cancel
    及其
    MayInterruptFrunning
    标志在文档中非常明确。您的
    if(successFullResultCondition.test(workUnit))
    将针对所有未来执行。您认为正确的唯一原因是主线程很早就存在,并且VM不会等待
    ForJoinPool
    线程完成其工作(您在引擎罩下使用
    supplyAsync
    ).当然,这种情况在实际生产中是很牵强的。您的失败始于:“我想在以下任一条件下停止执行”。一旦
    CompletableFuture
    启动,就没有办法停止它。
    CompletableFuture::cancel
    及其
    mayburrenning
    标志在文档中非常明确。您的
    if(successFullResultCondition.test(workUnit))
    将针对所有未来执行。您认为正确的唯一原因是主线程很早就存在,并且VM不会等待
    ForJoinPool
    线程完成其工作(您可以使用
    supplyAsync
    在后台使用)。当然,在实际生产中,这样的场景是牵强的。