CompletableFuture多任务组合
简介
上一篇写了CompletableFuture的一些常用方法,今天看看CompletableFuture的一些不是很常用的方法,至少我是不常用…接着上篇讲,上篇最后我记得提过allof,和anyof方法
allof,anyof方法
allof顾名思义,就是所有的任务执行完成后返回future,
anyif就是只要有一个任务执行完成后就返回future并将第一个完成的参数带着一起返回,
代码:
@Test
public void allOfTest1() throws Exception {
CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "f1";
});
CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
// throw new RuntimeException("aa");
return "f2";
});
CompletableFuture<Void> all = CompletableFuture.allOf(f1, f2).thenApply(x -> {
System.out.println("all");
return null;
});
//阻塞,直到所有任务结束。任务complete就会执行,handler里面不一定会执行..
System.out.println(System.currentTimeMillis() + ":阻塞");
//join 或者get
Void aVoid = all.get();
System.out.println(System.currentTimeMillis() + ":阻塞结束");
//一个需要耗时2秒,一个需要耗时3秒,只有当最长的耗时3秒的完成后,才会结束。
System.out.println("任务均已完成。");
}
执行结果:
如果异常也是直接报错.
如果想处理异常,可以直接处理,可以通过whencomplete,handler方法…
anyof
同理,直接上代码;
@Test
public void anyOfTest() throws Exception {
CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "f1";
});
CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
// throw new RuntimeException("aa");
return "f2";
});
CompletableFuture<Object> anyof = CompletableFuture.anyOf(f1, f2).handle((x, y) -> {
System.out.println(x);
return x;
});;
//阻塞,直到所有任务结束。任务complete就会执行,handler里面不一定会执行..
anyof.get();
//一个需要耗时2秒,一个需要耗时3秒,只有当最长的耗时3秒的完成后,才会结束。
System.out.println("任务均已完成。");
}
返回结果:
如果是f1先返回那参数就是f1,如果是异常,那么异常就带过来了…
世界上所有的不公平都是由于当事人能力不足造成的.