清凤

导航

 

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

  

posted on 2022-03-20 10:58  清凤  阅读(252)  评论(0编辑  收藏  举报