java8之parallelStream并发

    技术2024-01-06  92

    一、stream介绍

    1、基础用法

    遍历 bookList.stream().forEach(book->System.out.println(book.getId())); 过滤并统计数量 bookList.stream().filter(book -> "1".equals(book.getType())).mapToInt(Book::getQuantity).sum() List转换成Map // 1、Book::getId,Map的key // 2、Function.identity(),map的Value,也就是book对象 List<Book> bookList = new ArayList<>(); bookList.stream().collect(Collectors.toMap(Book::getId, Function.identity()));

    二、parallelStream并行

    1、基础使用

    package com.cf.example.java.java8.stream; import java.util.ArrayList; import java.util.List; /** * 流元素并发使用 * * @author ylfcf * @date 20-7-4 上午10:18 */ public class ParallelStreamUse { public static void main(String[] args) { List<String> stringList = new ArrayList() {{ add("1"); add("2"); add("3"); add("4"); add("5"); }}; stringList.parallelStream().forEach(string -> { System.out.println(Thread.currentThread().getName() + "\t" + string); }); } }

    2、并发(线程池)设置

    parallelStream并行,底层实现采用ForkJoin,线程池大小默认为:cpu核心数

    获取cpu核心数代码: Runtime.getRuntime().availableProcessors(); 手动设置ForkJoin线程池大小 // 线程池大小配置为20 String FORK_JOIN_POOL_PARALLELISM = "java.util.concurrent.ForkJoinPool.common.parallelism"; System.setProperty(FORK_JOIN_POOL_PARALLELISM, "20");

    PS:在JDK源码中,ForkJoinPool.java下makeCommonPool()方法中可找到该属性配置

    Processed: 0.012, SQL: 9