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程序设计有所帮助。
推荐阅读