实现目标

  1. 理解各种异步类的使用模式,并熟练使用这些类。
  2. 熟悉需要的一些线程的调用模式

学习

1. 构造函数 supplyAsync 和 runAsync 的区别

supplyAsync表示创建带返回值的异步任务的,相当于ExecutorService submit(Callable task) 方法,runAsync表示创建无返回值的异步任务,相当于ExecutorService submit(Runnable task)方法,这两方法的效果跟submit是一样的,两个方法各重载了一个可置入


以下为回调函数

2. thenApply / thenApplyAsync 异步回调

前者是由执行job1的线程立即执行job2,即两个job都是同一个线程执行的
后者是将job2提交到线程池中异步执行,实际执行job2的线程可能是另外一个线程

3. thenAccept / thenRun

thenAccept 同 thenApply 接收上一个任务的返回值作为参数,但是无返回值;
thenRun 的方法没有入参,也买有返回值,测试用例如下:

4. exceptionally whenComplete handle

whenComplete 未发生异常正常返回值发生异常就返回异常
exceptionally确认会发生异常
handle 基本一致 区别在于 handle 有返回值


以下是组合处理

7 thenCombine / thenAcceptBoth / runAfterBoth

这三个方法都是将两个CompletableFuture组合起来,只有这两个都正常执行完了才会执行某个任务,区别在于,thenCombine会将两个任务的执行结果作为方法入参传递到指定方法中,且该方法有返回值;thenAcceptBoth同样将两个任务的执行结果作为方法入参,但是无返回值;runAfterBoth没有入参,也没有返回值。注意两个任务中只要有一个执行异常,则将该异常信息作为指定任务的执行结果。

8 applyToEither / acceptEither / runAfterEither

三个方法都是将两个CompletableFuture组合起来,只要其中一个执行完了就会执行某个任务,其区别在于applyToEither会将已经执行完成的任务的执行结果作为方法入参,并有返回值;acceptEither同样将已经执行完成的任务的执行结果作为方法入参,但是没有返回值;runAfterEither没有方法入参,也没有返回值。注意两个任务中只要有一个执行异常,则将该异常信息作为指定任务的执行结果。

9. thenCompose

thenCompose方法会在某个任务执行完成后,将该任务的执行结果作为方法入参然后执行指定的方法,该方法会返回一个新的CompletableFuture实例,如果该CompletableFuture实例的result不为null,则返回一个基于该result的新的CompletableFuture实例;如果该CompletableFuture实例为null,则,然后执行这个新任务。

10 thenCompose

thenCompose方法会在某个任务执行完成后,将该任务的执行结果作为方法入参然后执行指定的方法,该方法会返回一个新的CompletableFuture实例,如果该CompletableFuture实例的result不为null,则返回一个基于该result的新的CompletableFuture实例;如果该CompletableFuture实例为null,则,然后执行这个新任务

策略

  1. 分类API
  2. 单个写场景学习

参考内容

  1. gitee 代码
  2. 强烈推荐 Java8 CompletableFuture 用法全解
  3. Java8 AbstractExecutorService 和 FutureTask 源码解析
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐