欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-09 17:51:03
本文实例讲述了java8并行流中自定义线程池操作。分享给大家供大家参考,具体如下: 1.概览 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程序设计有所帮助。