Java8并行流中自定义线程池操作示例

 更新时间:2019年05月03日 14:41:14   作者:lyuharvey  
这篇文章主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧,需要的朋友可以参考下

本文实例讲述了Java8并行流中自定义线程池操作。分享给大家供大家参考,具体如下:

1.概览

java8引入了流的概念,流是作为一种对数据执行大量操作的有效方式。并行流可以被包含于支持并发的环境中。这些流可以提高执行性能-以牺牲多线程的开销为代价

在这篇短文中,我们将看一下 Stream API的最大限制,同时看一下如何让并行流和线程池实例(ThreadPool instance)一起工作。

2.并行流Parallel Stream

我们先以一个简单的例子来开始-在任一个Collection类型上调用parallelStream方法-它将返回一个可能的并行流。

@Test
publicvoidgivenList_whenCallingParallelStream_shouldBeParallelStream(){
  List aList = newArrayList<>();
  Stream parallelStream = aList.parallelStream();
  assertTrue(parallelStream.isParallel());
}

这样的流的默认处理流程是使用ForkJoinPool.commonPool(),这是一个被整个应用程序所共享的线程池。

3.自定义线程池

在处理流的时候,我们可以传递自定义一个线程池。下面的例子中,我们有一个并行流,这个并行流使用了一个自定义的线程池去计算1到 1,000,000的和:

@Testpublic void giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal() throws InterruptedException, ExecutionException { long firstNum = 1; long lastNum = 1_000_000; List aList = LongStream.rangeClosed(firstNum, lastNum).boxed()
   .collect(Collectors.toList());
  ForkJoinPool customThreadPool = new ForkJoinPool(4);
  long actualTotal = customThreadPool.submit(
   () -> aList.parallelStream().reduce(0L, Long::sum)).get();
  assertEquals((lastNum + firstNum) * lastNum / 2, actualTotal);
}

我们使用ForkJoinPool的构造方法并设定并行级别为4去创建一个线程池。要想确定不同环境的最优值(optimal),我们需要试验一下。一个好的做法就是,基于你CPU的核数来确定并行级别的数值。

4.总结

我们简要地看了一下,如何使用一个自定义的Thread Pool运行并行流。只要在正确的环境中配置了合适的平行级别,就能在确定的情况下获得较高的执行性能。

更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Java如何实现上传文件到服务器指定目录

    Java如何实现上传文件到服务器指定目录

    这篇文章主要介绍了Java如何实现上传文件到服务器指定目录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • jmeter实现接口关联的两种方式(正则表达式提取器和json提取器)

    jmeter实现接口关联的两种方式(正则表达式提取器和json提取器)

    Jmeter用于接口测试时,后一个接口经常需要用到前一次接口返回的结果,本文主要介绍了jmeter实现接口关联的两种方式,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Springboot热加载JAR包的实现方法

    Springboot热加载JAR包的实现方法

    SpringBoot作为一个开发快速、部署方便的微服务框架,具有自动配置、约定优于配置的特点,能够极大地提高开发效率,它提供了丰富的扩展点,非常适合实现动态加载Jar包的功能,本文将深入探讨如何在SpringBoot应用中实现动态加载Jar包的方案,感兴趣的朋友一起看看吧
    2024-04-04
  • Java使用LinkedHashMap进行分数排序

    Java使用LinkedHashMap进行分数排序

    这篇文章主要介绍了Java使用LinkedHashMap进行分数排序的相关代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • JAVA(MAVEN项目)添加JUnit依赖配置全过程

    JAVA(MAVEN项目)添加JUnit依赖配置全过程

    在Maven项目中进行单元测试是确保代码质量的重要步骤,本教程提供SpringBoot和微服务平台适用的单元测试方法,包括环境准备、创建测试类、JUnit简介及注解使用,环境准备涉及引入依赖和安装JUnit插件,测试类创建可通过快捷键或手动添加@Test注解来实现
    2024-10-10
  • SpringBoot静态资源目录访问

    SpringBoot静态资源目录访问

    今天小编就为大家分享一篇关于SpringBoot静态资源目录访问,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • SpringBoot实现JWT动态密钥轮换的示例详解

    SpringBoot实现JWT动态密钥轮换的示例详解

    这篇文章主要为大家详细介绍了SpringBoot实现JWT动态密钥轮换的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-10-10
  • Spring Cloud Alibaba微服务组件Sentinel实现熔断限流

    Spring Cloud Alibaba微服务组件Sentinel实现熔断限流

    这篇文章主要为大家介绍了Spring Cloud Alibaba微服务组件Sentinel实现熔断限流过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Java命名规范

    Java命名规范

    本文主要介绍了Java命名规范。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 总结Java集合类操作优化经验

    总结Java集合类操作优化经验

    本文主要介绍的就是集合框架的使用经验,告诉大家如何高效、方便地管理对象,所有代码基于JDK7,需要的朋友可以参考下
    2015-08-08

最新评论