并行库parallelStream设置并行数量

为什么要使用并行库

在java中,我们通常使用并行库,达到对多核处理器的最大利用,提高程序执行效率。在java8中,我们可以使用parallelStream来做一些并行处理。

    public static void main(String[] args) {
       testParalle();
    }

    private static void testParalle(){
        Stream<Integer> parallel = Arrays.asList(1, 2, 3, 5, 6, 7,8).stream().parallel();
        parallel.forEach(Application::doSome);
    }

    private static void doSome(int num) {
        try {
            System.out.println(String.format("time:%s begin:%s",LocalTime.now(),num));
            Thread.sleep(num * 500);
            System.out.println(String.format("time:%s end:%s",LocalTime.now(),num));
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }

并行库的底层

parallelStream默认使用了fork/join框架,其默认线程数是CPU核心数

观察运行结果,可以发现只有4个并行,再次证实了该点(我的cpu是4核)

设置并行数

在某些场景中,我们不希望抢占所有的CPU核心。可以通过ForkJoinPool来设置并行数

public static void main(String[] args) {
      //testParalle();
      testParalleNum(2);
}
public static void testParalleNum(int parallelism) {
        Stream<Integer> stream = Arrays.asList(1, 2, 3, 5, 6, 7,8).stream();
        new ForkJoinPool(parallelism).submit(() -> stream.parallel().forEach(Application::doSome)).join();
    }

在这里,我们将并行数设置为2,可以看到结果:

posted @ 2021-02-03 16:12  划破黑夜  阅读(2939)  评论(0编辑  收藏  举报