可昕之家

可昕之家

张先生

平淡如水,爱护家人,好好工作

48 文章数
0 评论数

java8中parallelStream的使用

张清磊
2025-03-19 / 0 评论 / 15 阅读 / 0 点赞

案例代码:并行计算平方值并收集结果

java

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class ParallelStreamDemo {
    public static void main(String[] args) {
        // 1. 准备数据:1~10 的整数列表
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 2. 使用 parallelStream 并行处理
        List<Integer> squaredNumbers = numbers.parallelStream()
                .map(number -> {
                    // 模拟耗时操作(如:复杂计算或远程调用)
                    try {
                        Thread.sleep(100); // 增加延迟观察并行效果
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    return number * number;
                })
                .collect(Collectors.toList()); // 3. 收集结果

        // 4. 输出结果
        System.out.println("原始数据: " + numbers);
        System.out.println("计算结果: " + squaredNumbers);
    }
}

关键分析:如何获取执行结果

1. 结果收集方式

  • Collectors.toList()
    通过 collect(Collectors.toList()) 将并行处理后的结果汇总到新的 List 中。
    线程安全性Collectors.toList() 内部使用线程安全的容器,无需额外同步。
  • 其他收集方式
    若需自定义集合类型,可使用 collect(Collectors.toCollection(ConcurrentLinkedQueue::new)) 等线程安全容器。

2. 执行完成保证

  • 阻塞等待机制
    collect() 方法会阻塞当前线程,直到所有并行任务完成并返回最终结果集合。
  • 验证方法
    collect() 后直接输出结果(如示例代码),可观察到所有计算结果均已完整收集。

3. 执行顺序说明

  • 顺序一致性
    尽管并行处理的顺序不确定,但 Collectors.toList() 会按照原始数据顺序存储结果(1→1, 2→4, 3→9,依此类推)。
  • 验证顺序
    输出结果列表时,元素的顺序始终与原始列表一致,尽管计算过程可能是乱序的。

输出示例

复制

原始数据: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
计算结果: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

注意事项

  1. 避免副作用
    不要在并行流中修改共享变量(如全局计数器),应使用纯函数式操作(如 mapfilter)。

  2. 任务粒度控制
    并行流适合处理耗时较长的任务,若单个任务极快(如简单算术),可能因线程调度开销反而降低性能。

  3. 自定义线程池​
    默认使用公共的 ForkJoinPool,若需隔离资源,可通过自定义线程池执行:
    java

    复制

    ForkJoinPool customPool = new ForkJoinPool(4);
    customPool.submit(() -> {
        list.parallelStream().map(...).collect(...);
    }).get();
    

通过上述案例,可以安全地利用 parallelStream 实现并行处理并正确获取结果。

上一篇 下一篇
评论
最新回复
    暂无内容
光阴似箭
今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月
文章目录
今日天气