多线程并发执行任务,汇总结果集,Future、FutureTask、CompletionService、CompletableFuture


1.Futrue
  • 原理:
  • demo:
  • 建议:此种方法可实现基本目标,任务并行且按照完成顺序获取结果。使用很普遍,老少皆宜,就是CPU有消耗,可以使用!
  • 2.FutureTask
    • 原理:
    • demo:
    • 建议:demo1在特定场合例如有十分耗时的业务但有依赖于其他业务不一定非要执行的,可以尝试使用。demo2多线程并发执行并结果归集,这里多套一层FutureTask比较鸡肋(直接返回Future简单明了)不建议使用。
  • 3.CompletionService:
  • 4.CompletableFuture
    • 原理:
  • 5.总结:
  • 正文

    开启线程执行任务,不管是使用Runnable(无返回值不支持上报异常)还是Callable(有返回值支持上报异常)接口,都可以轻松实现。那么如果开启线程池并需要获取结果归集的情况下,如何实现,以及优劣,老司机直接看总结即可。

    任务执行完,结果归集时,几种方式:

    回到顶部回到顶部回到顶部回到顶部回到顶部

    5.总结:

    FutureTask

    CompletableFuture

    原理

    Futrue接口

    接口RunnableFuture的唯一实现类,RunnableFuture接口继承自Future+Runnable: 内部通过阻塞队列+FutureTask接口 JDK8实现了Future, CompletionStage2个接口 多任务并发执行 支持 支持 支持 支持 获取任务结果的顺序

    支持任务完成先后顺序

     未知  支持任务完成的先后顺序 支持任务完成的先后顺序 异常捕捉  自己捕捉  自己捕捉  自己捕捉 源生API支持,返回每个任务的异常 建议 CPU高速轮询,耗资源,可以使用,但不推荐
     功能不对口,并发任务这一块多套一层,不推荐使用。  推荐使用,没有JDK8CompletableFuture之前最好的方案,没有质疑

      API极端丰富,配合流式编程,速度飞起,推荐使用!

     个人补充:

    CompletableFuture在 java9 提供了超时时间控制的方法,在 java8 中提前中断线程需要个人处理

    转载:

    https://www.cnblogs.com/dennyzhangdd/p/7010972.html