CompletableFuture

  • 在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。
  • 它可能代表一个明确完成的Future,也有可能代表一个完成阶段( CompletionStage ),它支持在计算完成以后触发一些函数或执行某些动作。
  • 它实现了Future和CompletionStage接口

创建CompletableFuture

  • supplyAsync 有
  • runAsync 无
    两者的区别在于是否返回result

执行

  • CompletableFuture.allOf()
  • CompletableFuture.anyOf()
    两者的区别在于是否需要全部任务执行完在继续
    allOf是阻塞式的,需要全部future执行完才会继续
    anyOf则是有个执行完就ok
    调用get方法,得到结果值

回调函数

  • thenApply回调函数(callback)img img

当前阶段正常完成以后执行,而且当前阶段的执行的结果会作为下一阶段的输入参数。thenApplyAsync默认是异步执行的。这里所谓的异步指的是不在当前线程内执行。

  • thenAccept与thenRun

    thenAccept和thenRun都是无返回值的。如果说thenApply是不停的输入输出的进行生产,那么thenAccept和thenRun就是在进行消耗。它们是整个计算的最后两个阶段。
    同样是执行指定的动作,同样是消耗,二者也有区别:

    • thenAccept接收上一阶段的输出作为本阶段的输入   
    • thenRun根本不关心前一阶段的输出,根本不不关心前一阶段的计算结果,因为它不需要输入参数
  • thenCombine整合两个计算结果

    此阶段与其它阶段一起完成,进而触发下一阶段:

  • whenComplete

样例: