1. 什么是 parallelstream?
在 java 8 中,stream api 提供了 stream() 和 parallelstream() 两种流处理方式。
stream()采用顺序流处理数据,每个元素按照流的顺序依次处理。parallelstream()采用并行流处理数据,利用forkjoinpool并发执行,提高处理效率。
2. parallelstream 的优势
- 充分利用多核 cpu:并行流会将任务拆分为多个子任务,并分配到多个 cpu 核心执行。
- 提升处理速度:适用于计算密集型任务,能明显提高大数据量的处理效率。
- api 友好:
parallelstream()的使用方式与stream()类似,开发成本较低。
3. parallelstream 的使用
3.1 基本使用
import java.util.arrays;
import java.util.list;
public class parallelstreamexample {
public static void main(string[] args) {
list<string> list = arrays.aslist("a", "b", "c", "d", "e", "f");
// 使用并行流处理数据
list.parallelstream().foreach(system.out::println);
}
}
注意:并行流的输出顺序是无序的,因为多个线程并发执行。
3.2 计算总和示例
import java.util.stream.intstream;
public class parallelsum {
public static void main(string[] args) {
int sum = intstream.rangeclosed(1, 100)
.parallel()
.sum();
system.out.println("sum: " + sum);
}
}
3.3 结合groupingbyconcurrent实现线程安全的分组操作
- 使用parallelstream将分组过程并行化提升效率,使用
groupingbyconcurrent及concurrentmap避免出现线程安全的问题
map<string, list<coursegrade>> collect = coursegrades .parallelstream() .collect(collectors.groupingbyconcurrent(coursegrade::getyear));
4. parallelstream 的注意事项
4.1 适用场景
| 适用场景 | 不适用场景 |
|---|---|
| 数据量大 | 数据量小 |
| 计算密集型任务 | io 密集型任务 |
| 不关心执行顺序 | 需要严格顺序执行 |
| 需要提升性能 | 线程切换成本高 |
4.2 并行流的局限性
- 线程开销:并行流会使用
forkjoinpool线程池,线程的创建和切换会带来一定的开销。 - 数据竞争:如果流操作涉及共享变量,可能会出现线程安全问题。
- 不适合小数据量:并行执行存在一定的启动成本,数据量太小可能会降低性能。
5. 控制并行流线程数
默认情况下,parallelstream() 使用 forkjoinpool 的公共线程池,线程数与 cpu 核心数相同。
如果需要自定义线程池大小,可以使用以下方式:
import java.util.concurrent.forkjoinpool;
import java.util.stream.intstream;
public class customparallelstream {
public static void main(string[] args) {
forkjoinpool custompool = new forkjoinpool(4); // 设置 4 个线程
custompool.submit(() ->
system.out.println(intstream.range(1, 100)
.parallel()
.sum())
).join();
custompool.shutdown();
}
}
6. 总结
parallelstream()能有效提高大数据量的处理效率。- 适用于计算密集型任务,但可能不适用于 io 密集型任务。
- 默认使用
forkjoinpool,可以自定义线程池大小。 - 需谨慎使用,避免线程安全问题和不必要的开销。
到此这篇关于java 并行流(parallelstream)的具体使用小结的文章就介绍到这了,更多相关java 并行流内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论