当前位置: 首页 > 知识库问答 >
问题:

完全的未来。allOf()在个人期货交易后未完成

郭凯
2023-03-14

当我使用完全的未来。allOf()组合javadoc中描述的独立可完成的未来,在提供给该方法的所有未来之后,它不能可靠地完成。例如。:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Runnable dummyTask = () -> {
            try {
                Thread.sleep(200);
            } catch (InterruptedException ignored) {
            }
        };

        CompletableFuture<Void> f1 = CompletableFuture.runAsync(dummyTask);
        CompletableFuture<Void> f2 = CompletableFuture.runAsync(dummyTask);
        CompletableFuture[] all = {f1, f2};
        f1.whenComplete((aVoid, throwable) -> System.out.println("Completed f1"));
        f2.whenComplete((aVoid, throwable) -> System.out.println("Completed f2"));
        CompletableFuture<Void> allOf = CompletableFuture.allOf(all);
        allOf.whenComplete((aVoid, throwable) -> {
                    System.out.println("Completed allOf");
                }
        );
        allOf.join();
        System.out.println("Joined");
    }
}

结果如下:

Completed f2
Joined
Completed allOf
Completed f1

我希望日志“Joined”和“Completed allOf”写在“Completed f1”和“Completed f2”之后。为了让事情变得更加混乱,阵列中的未来顺序似乎是头等大事。如果我换了台词

CompletableFuture[] all = {f1, f2};

CompletableFuture[] all = {f2, f1};

结果输出更改为:

Completed allOf
Completed f1
Completed f2
Joined

更糟糕的是,如果我多次运行完全相同的代码,顺序会再次改变。我可以理解“f1”和“f2”的顺序是随机变化的,“allOf”和“Joed”也是如此。但这真的很令人惊讶。

以防万一:这是Windows 7上的JDK 1.8.091。

共有3个答案

严易安
2023-03-14

调用wenComplete方法上的join

allOf.whenComplete((aVoid, throwable) -> {
                System.out.println("Completed allOf");
            }
    ).join();
仲孙鸣
2023-03-14

这没关系-没有人保证回调的顺序。

经福
2023-03-14

f1。whenComplete返回独立于f1的新未来AllOf将等待f1完成,但不等待在完成时传递给的lambda完成。为了得到你想要的结果,你可以尝试以下方法:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Runnable dummyTask = () -> {
            try {
                Thread.sleep(200);
            } catch (InterruptedException ignored) {
            }
        };

        CompletableFuture<Void> f1 = CompletableFuture.runAsync(dummyTask);
        CompletableFuture<Void> f2 = CompletableFuture.runAsync(dummyTask);
        f1 = f1.whenComplete((aVoid, throwable) -> System.out.println("Completed f1"));
        f2 = f2.whenComplete((aVoid, throwable) -> System.out.println("Completed f2"));
        CompletableFuture[] all = {f1, f2};
        CompletableFuture<Void> allOf = CompletableFuture.allOf(all);
        allOf.whenComplete((aVoid, throwable) -> {
            System.out.println("Completed allOf");
        });
        allOf.join();
        System.out.println("Joined");
    }
}

 类似资料:
  • 来自javadocs, 如果任何给定的CompletableFutures异常完成,那么返回的CompletableFutures也会这样做,CompletionException将此异常作为其原因。 如果异常完成,则返回的CompletableFuture也会这样做,CompletionException将此异常作为其原因。 这是否意味着allOf()和anyOf()在任何Completable

  • 我想要一个完整的未来,只发出完成的信号(例如,我没有返回值)。 我可以将CompletableFuture实例化为: 但是我应该向完整的方法提供什么呢?例如,我不能做

  • 我正在编写一个创建多个(7个)CompletableFutures的函数。这些期货基本上都做两件事: 使用supplyAsync()从某些数据库获取数据 使用thenAccept()将此数据写入CSV文件 当所有的7个期货都完成了工作,我想继续进一步的代码执行。因此,我使用allOf()然后对allOf()返回的Void CompletableFuture调用join()。 问题是,即使在所有的未

  • 这是我正在研究的完全未来的例子 首先我从SupplySync调用compose方法,在这里我执行方法composeMethod,有三毫秒的延迟,然后它将创建一个文件并返回一个字符串作为结果。完成后,我调用Run方法,它只打印一个方法,然后有一个非阻塞方法从主线程运行。 我在这里面临的问题是,主线程执行完nonblockingmethod()并在3毫秒延迟之前退出进程,而随后的composeMeth

  • 我想用Java 8-9启动线程,使用异步模式,这些是我的类和我的线程: 我有三根线。我的类包含单个方法 按以下方式设置我的%s: 正在创建线程: 最后,我的问题是我如何使用异步模式启动这三个线程。

  • 如何使用5个CompletableFutures异步执行20个可运行任务(或1个任务20次)? 这就是我得到的: 如果我执行这段代码,我可以看到它只运行3次。异步获取():3,然后在1 for()迭代中剩下2 所以,我想做所有20个任务,尽可能异步