带有Async方法 就是个 新开一条线程,否则就是和上面执行共用一条线程
runAsync
@Test
public void test01() throws ExecutionException, InterruptedException {
// 没有返回结果
CompletableFuture<Void> async = CompletableFuture.runAsync(() -> {
System.out.println("begin =======this is runAsync");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" =======end");
});
System.out.println(Thread.currentThread().getName() + "-------");
async.get(); //阻塞等待
}
supplyAsync 可以拿到上一步的返回值
@Test
public void test02() throws ExecutionException, InterruptedException {
System.out.println("main begin");
CompletableFuture<Integer> async = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName()+"运行了");
int i = 10 /2;
System.out.println("运行结果:"+i);
return i ;
});
System.out.println("main end "+async.get());
}
出现异常
@Test
public void test02() throws ExecutionException, InterruptedException {
System.out.println("main begin");
CompletableFuture<Integer> async = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName()+"运行了");
int i = 10 / 2;
System.out.println("运行结果:"+i);
return i ;
}).whenCompleteAsync(((u,t)->{
System.out.println("result:"+u+" error:"+t.getMessage());
})).exceptionally(throwable -> {
// 以上出现异常默认返回 10
return 10;
});
System.out.println("main end "+async.get());
}
handleAsync((T, U)->{ //出现或不出现异常都进行下一步处理
log.info(" T: {} , U: {}",T, U);
return 20;
})
thenApplyAsync() 拿到上一部的返回值继续执行 执行完成有返回值
详细博客
https://www.cnblogs.com/li-zhi-long/p/11936642.html
合并线程 两个线程全部执行完才会合并
// 等a b 执行结束在合并运行
a.runAfterBothAsync((b,()->{});
// 等a b 执行结束得到返回值合并运行 (a的返回值 a1 b的返回值b1)
a.thenAcceptBothAsync(b,(a1,b1)->{}) ;
// 继之前有返回值
a.thenCombineAsync(b,(a1,b1)->{return “”;}) ;
一个执行完 就会执行
// a或者b其中一个执行完 执行
a.runAfterEitherAsync(b,()->{})
// a或者b其中一个执行完 拿到返回值执行
a.runAfterEitherAsync(b,(resp)->{})
// a 或者b其中一个执行完 拿到返回值执行 执行完返回结果
a.applyToEitherAsync(b,(resp)->{return resp;})
多任务组合
// abc 全部完成才继续执行
CompletableFuture.allOf(a, b, c)
// abc 其中一个执行完成继续执行
CompletableFuture.anyOf(a, b, c)