CompletableFuture 在 Java 里面被用于异步编程,异步通常意味着非阻塞, 可以使得我们的任务单独运行在与主线程分离的其他线程中,并且通过回调可 以在主线程中得到异步任务的执行状态,是否完成,和是否异常等信息。

  • 同步是指:当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续执行下去。
  • 异步是指:当程序1调用程序2时,程序1径自继续自己的下一个动作,不受程序2的的影响。

    Future和CompletableFuture

    前者是同步调用,后者是异步调用
    Futrue 在 Java 里面,通常用来表示一个异步任务的引用,比如我们将任务提交到线程池里面,然后我们会得到一个 Futrue,在 Future 里面有 isDone 方法来 判断任务是否处理结束,还有 get 方法可以一直阻塞直到任务结束然后获取结果,但整体来说这种方式,还是同步的,因为需要客户端不断阻塞等待或者不断轮询才能知道任务是否完成
    CompletableFuture 实现了 Future, CompletionStage 接口,实现了 Future 接口就可以兼容现在有线程池框架,而 CompletionStage 接口才是异步编程 的接口抽象,里面定义多种异步方法,通过这两者集合,从而打造出了强大的 CompletableFuture 类。
    image.png
  1. //异步调用和同步调用
  2. public class CompletableFutureDemo {
  3. public static void main(String[] args) throws Exception {
  4. //异步调用,无返回值
  5. CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(()->{
  6. System.out.println(Thread.currentThread().getName()+" : CompletableFuture1");
  7. });
  8. completableFuture1.get();
  9. //mq消息队列
  10. //异步调用,有返回值
  11. CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(()->{
  12. System.out.println(Thread.currentThread().getName()+" : CompletableFuture2");
  13. //模拟异常
  14. int i = 10/0;
  15. return 1024;
  16. });
  17. completableFuture2.whenComplete((t,u)->{
  18. System.out.println("------t="+t); //返回值
  19. System.out.println("------u="+u); //异常信息
  20. }).get();
  21. }
  22. }