一、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();