自定义parallelStream的thread pool

15 篇文章 1 订阅


自定义parallelStream的thread pool

简介

之前我们讲到parallelStream的底层使用到了ForkJoinPool来提交任务的,默认情况下ForkJoinPool为每一个处理器创建一个线程,parallelStream如果没有特别指明的情况下,都会使用这个共享线程池来提交任务。

那么在特定的情况下,我们想使用自定义的ForkJoinPool该怎么处理呢?

通常操作

假如我们想做一个从1到1000的加法,我们可以用并行stream这样做:

List<Integer> integerList= IntStream.range(1,1000).boxed().collect(Collectors.toList());
        ForkJoinPool customThreadPool = new ForkJoinPool(4);

        Integer total= integerList.parallelStream().reduce(0, Integer::sum);
        log.info("{}",total);

输出结果:


INFO com.flydean.CustThreadPool - 499500

使用自定义ForkJoinPool

上面的例子使用的共享的thread pool。 我们看下怎么使用自定义的thread pool来提交并行stream:

List<Integer> integerList= IntStream.range(1,1000).boxed().collect(Collectors.toList());

ForkJoinPool customThreadPool = new ForkJoinPool(4);
        Integer actualTotal = customThreadPool.submit(
                () -> integerList.parallelStream().reduce(0, Integer::sum)).get();
        log.info("{}",actualTotal);

上面的例子中,我们定义了一个4个线程的ForkJoinPool,并使用它来提交了这个parallelStream。

输出结果:

INFO com.flydean.CustThreadPool - 499500

总结

如果不想使用公共的线程池,则可以使用自定义的ForkJoinPool来提交。

本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/stream-cust-threadpool

更多精彩内容且看:

欢迎关注我的公众号:程序那些事,更多精彩等着您!
更多内容请访问 www.flydean.com

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CachePool线程池是一种基于缓存机制的线程池,可以提高线程的处理效率和速度。下面是一个自定义的CachePool线程池实现: ```java import java.util.concurrent.*; public class CachePool { private ExecutorService executorService; public CachePool() { int corePoolSize = 0; int maximumPoolSize = Integer.MAX_VALUE; long keepAliveTime = 60L; TimeUnit unit = TimeUnit.SECONDS; BlockingQueue<Runnable> workQueue = new SynchronousQueue<Runnable>(); ThreadFactory threadFactory = Executors.defaultThreadFactory(); RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); executorService = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); } public void execute(Runnable task) { executorService.execute(task); } public void shutdown() { executorService.shutdown(); } public boolean isTerminated() { return executorService.isTerminated(); } } ``` 该线程池使用了ThreadPoolExecutor类来实现,其中corePoolSize和maximumPoolSize都设置为最大值Integer.MAX_VALUE,因此线程池中的线程数不会有限制。keepAliveTime设置为60秒,表示线程在空闲60秒后会被回收。workQueue采用了SynchronousQueue,这是一个没有容量限制的阻塞队列,可以让任务立即提交给线程处理,从而避免了任务的排队等待。RejectedExecutionHandler采用了ThreadPoolExecutor.AbortPolicy,表示如果线程池已经达到最大容量,且所有线程都在执行任务,此时再有新任务提交时,会抛出RejectedExecutionException异常,从而避免了线程池过载的情况。execute方法用于提交任务,shutdown方法用于关闭线程池,isTerminated方法用于判断线程池是否已经关闭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flydean程序那些事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值