Java并发-Future


  • FutureTask: 存储任务的处理结果,更新任务的状态
    • 既可以被当做Runnable来执行,也可以被当做Future来获取Callable的返回结果
  • Future: cancel isCancelled isDone get
  • CompletionService 一边生成任务,一边获取任务的返回值,任务之间不会互相阻塞,可以实现先执行完的先取结果,不再依赖任务顺序了
    • 内部通过阻塞队列+FutureTask,实现了任务先完成可优先获取到,即结果按照完成先后顺序排序
    • 内部有一个先进先出的阻塞队列,用于保存已经执行完成的Future,通过调用它的take方法或poll方法可以获取到一个已经执行完成的Future,进而通过调用Future接口实现类的get方法获取最终的结果
  • CompletionStage 执行某一个阶段,可向下执行后续阶段。异步执行,默认线程池是 ForkJoinPool.commonPool()
  • CompletableFuture 实现了对任务的编排能力(业务逻辑处理存在串行[依赖]、并行、聚合的关系)
    • 获取结果
      • join 抛出的是 uncheck 异常(即未经检查的异常),不会强制开发者抛出
      • get 抛出的是经过检查的异常,ExecutionException, InterruptedException 需要用户手动处理
    • 结果处理:whenComplete whenCompleteAsync exceptionally
      • 当 CompletableFuture 的计算结果完成,或者抛出异常的时候,我们可以执行特定的 Action
      • Action的类型是 BiConsumer<? super T,? super Throwable>,它可以处理正常的计算结果,或者异常情况
      • 方法不以Async结尾,意味着Action使用相同的线程执行,而Async可能会使用其它的线程去执行(如果使用相同的线程池,也可能会被同一个线程选中执行)
      • 这几个方法都会返回CompletableFuture,当Action执行完毕后它的结果返回原始的CompletableFuture的计算结果或者返回异常
    • 结果消费:结果消费系列函数只对结果执行Action,而不返回新的计算值
      • thenAccept系列(thenAccept thenAcceptAsync):对单个结果进行消费
      • thenAcceptBoth系列(thenAcceptBoth thenAcceptBothAsync):对两个结果进行消费
        • 当两个 CompletionStage 都正常完成计算的时候,就会执行提供的 action 消费两个异步的结果
      • thenRun系列(thenRun thenRunAsync):不关心结果,只对结果执行Action
        • 也是对线程任务结果的一种消费函数,与 thenAccept 不同的是,thenRun 会在上一阶段 CompletableFuture 计算完成的时候执行一个Runnable,Runnable 并不使用该 CompletableFuture 计算的结果
    • 依赖关系(结果转换)
      • thenApply() 把前面异步任务的结果,交给后面的Function
        • thenApply 转换的是泛型中的类型,返回的是同一个CompletableFuture
      • thenCompose() 用来连接两个有依赖关系的任务,结果由第二个任务返回
        • thenCompose 将内部的 CompletableFuture 调用展开来并使用上一个CompletableFutre 调用的结果在下一步的 CompletableFuture 调用中进行运算,是生成一个新的CompletableFuture
    • and聚合关系(结果组合):合并线程任务的结果,并进一步处理
      • thenCombine 任务合并,有返回值
      • thenAccepetBoth 两个任务执行完成后,将结果交给thenAccepetBoth消耗,无返回值
      • runAfterBoth 两个任务都执行完成后,执行下一步操作(Runnable)
    • or聚合关系(任务交互:将两个线程任务获取结果的速度相比较,按一定的规则进行下一步处理)
      • applyToEither 两个任务谁执行的快,就使用那一个结果,有返回值
      • acceptEither 两个任务谁执行的快,就消费那一个结果,无返回值
      • runAfterEither 两个线程任意一个任务执行完成,进行下一步操作 (Runnable)
      • runAfterBoth 两个线程任务相比较,两个全部执行完成,才进行下一步操作,不关心运行结果
    • 并行执行(多个 CompletableFuture 并行执行)
      • CompletableFuture#anyOf anyOf 方法的参数是多个给定的 CompletableFuture,当其中的任何一个完成时,方法返回这个 CompletableFuture
      • CompletableFuture#allOf allOf方法用来实现多 CompletableFuture 的同时返回
    • 异步操作
      • runAsync 无返回值
      • supplyAsync 有返回值


文章作者: 钱不寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 钱不寒 !
  目录