【并发编程】异步任务编排

一。创建异步对象

  CompletableFuture 提供了四个静态方法来创建一个异步操作。

 

   runXxxx 都是没有返回结果的,supplyXxx 都是可以获取返回结果的。

  可以传入自定义的线程池,否则就用默认的线程池。

二。计算完成时回调方法

  whenComplete 可以处理正常和异常的计算结果,exceptionally 处理异常情况。

  whenComplete 和 whenCompleteAsync 的区别:

     whenComplete:是执行当前任务的线程执行继续执行 whenComplete 的任务。

    whenCompleteAsync:是执行把 whenCompleteAsync 这个任务继续提交给线程池来进行执行。

 

   方法不以 Async 结尾,意味着 Action 使用相同的线程执行,而 Async 可能会使用其他线程执行(如果是使用相同的线程池,也可能会被同一个线程选中执行)。

三。handle 方法

  和 complete 一样,可对结果做最后的处理(可处理异常),可改变返回值。

 

 四。线程串行化方法

 

  thenApply 方法:当一个线程依赖另一个线程时,获取上一个任务返回的结果,并返回当前任务的返回值。

  thenAccept 方法:消费处理结果。接收任务的处理结果,并消费处理,无返回结果。

  thenRun 方法:只要上面的任务执行完成,就开始执行 thenRun,只是处理完任务后,执行thenRun 的后续操作

  带有 Async 默认是异步执行的。同之前。

  以上都要前置任务成功完成。

  Function<? super,?extends U>

    T:上一个任务返回结果的类型

    U:当前任务的返回值类型

五。两任务组合 - 都要完成

 

   两个任务必须都完成,触发该任务。

  thenCombine:组合两个 future,获取两个 future 的返回结果,并返回当前任务的返回值

  thenAcceptBoth:组合两个 future,获取两个 future 任务的返回结果,然后处理任务,没有返回值。

  runAfterBoth:组合两个 future,不需要获取 future 的结果,只需两个future 处理完任务后,处理该任务。

六。两任务组合 - 一个完成

 

   当两个任务中,任意一个 future 任务完成的时候,执行任务。

  applyToEither:两个任务有一个执行完成,获取它的返回值,处理任务并有新的返回值。

  acceptEither:两个任务有一个执行完成,获取它的返回值,处理任务,没有新的返回值。

  runAfterEither:两个任务有一个执行完成,不需要获取 future 的结果,处理任务,也没有返回值。

七。多任务组合

 

   allOf:等待所有任务完成

  anyOf:只要有一个任务完成