java多线程并发之旅-30-Executor 总结

jdk8 以后的多线程处理

集合进行并行计算有两种方式:并行流和CompletableFutures。

并行流

计算密集型操作,并且没有I/O,推荐使用Stream接口。因为实现简单,同时效率也可能是最高的(如果所有的线程都是计算密集型的,那就没有必要创建比处理器核数更多的线程);

CompletableFutures

如果并行的工作单元还涉及等待I/O的操作(包括网络连接等待),那么使用CompletableFuture灵活性更好。这种情况下处理流的流水线中如果发生I/O等待,流的延迟特性会让我们很难判断到底什么时候触发了等待。

Exeutor 线程池

如何正确的创建线程池?

那么上面说了使用Executors创建的线程池有隐患,那如何使用才能避免这个隐患呢?

对症下药,既然FixedThreadPool和SingleThreadPool"可能"导致的OOM是由于使用了无界队列任务堆积,CacheThreadPool和ScheduledThreadPool是由于"可能"创建Interger.MAX_VALUE,那创建线程池时我们就使用有界队列或者指定最大允许创建线程个数即可。

使用下面的构造函数

private static ExecutorService executor = new ThreadPoolExecutor(10,10,60L, TimeUnit.SECONDS,new ArrayBlockingQueue(10));

样可以指定corePoolSize、maximumPoolSize、workQueue为ArrayBlockingQueue有界队列

常用多线程并发,取结果归集的几种实现方案

描述FutureFutureTaskCompletionServiceCompletableFuture
原理Future接口接口RunnableFuture的唯一实现类,RunnableFuture接口继承自Future+Runnable内部通过阻塞队列+FutureTask接口JDK8实现了Future, CompletionStage两个接口
多任务并发执行支持支持支持支持
获取任务结果的顺序按照提交顺序获取结果未知 支持任务完成的先后顺序支持任务完成的先后顺序
异常捕捉自己捕捉自己捕捉自己捕捉原生API支持,返回每个任务的异常
建议CPU高速轮询,耗资源,可以使用,但不推荐功能不对口,并发任务这一块多套一层,不推荐使用推荐使用,没有JDK8CompletableFuture之前最好的方案,没有质疑API极端丰富,配合流式编程,速度飞起,推荐使用!

参考资料

《java 并发编程实战》

Java8新特性整理之CompletableFuture:组合式、异步编程(七)

多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture

目录

java多线程并发之旅-01-并发概览

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值