一、CompletableFuture.supplyAsync 异步执行一个有返回值的Task
1. 执行一个有返回的值的task
2. 异步执行
//2.有返回值异步任务 supplyAsync()
CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync (() -> {
System.out.println ("线程号为***" + Thread.currentThread ().getId ());
int i = 5/0;
System.out.println ("---------" + i);
return i;
}, executor).whenComplete ((r, e) -> {
// whenComplete第一个参数是结果,第二个参数是异常,他可以感知异常,无法返回默认数据
System.out.println ("执行完毕,结果是---" + r + "异常是----" + e);
}).exceptionally (u -> {
// exceptionally只有一个参数是异常类型,他可以感知异常,同时返回默认数据10
return 10;
// handler既可以感知异常,也可以返回默认数据,是whenComplete和exceptionally的结合
}).handle ((r, e) -> {
if ( r != null ) {
return r;
}
if ( e != null ) {
return 0;
}
return 0;
});
System.out.println(integerCompletableFuture.get());
}
三、异步调用其他的Service
1. 加@Async 表示这是一个异步执行的Task,当然,也可以执定Executor的名字 @Async("feignTaskExecutor")
2. 使用CompletableFuture.completedFuture(results); 封装执行结果
@Async public CompletableFuture<User> findUser(String user) throws InterruptedException { logger.info("Looking up " + user); String url = String.format("https://api.github.com/users/%s", user); User results = restTemplate.getForObject(url, User.class); // Artificial delay of 1s for demonstration purposes Thread.sleep(1000L); return CompletableFuture.completedFuture(results); }
四、异步调用服务,合并最终结果
// Kick of multiple, asynchronous lookups
CompletableFuture<User> page1 = gitHubLookupService.findUser("PivotalSoftware");
CompletableFuture<User> page2 = gitHubLookupService.findUser("CloudFoundry");
CompletableFuture<User> page3 = gitHubLookupService.findUser("Spring-Projects");
// Wait until they are all done
CompletableFuture.allOf(page1,page2,page3).join();
浙公网安备 33010602011771号