当我使用完全的未来。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。
调用wenComplete方法上的join
allOf.whenComplete((aVoid, throwable) -> {
System.out.println("Completed allOf");
}
).join();
这没关系-没有人保证回调的顺序。
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个任务,尽可能异步