Java8——Stream并行流(一)

4.1 概述   随着计算机的发展,市面上很多服务器或者个人电脑都是多核多线程的CPU,在一个多核多线程的CPU中,程序可以做到真正的并行执行,如果我们编写了合理的多线程并行代码,那么对于那种...

1. 概述

  随着计算机的发展,市面上很多服务器或者个人电脑都是多核多线程的CPU,在一个多核多线程的CPU中,程序可以做到真正的并行执行,如果我们编写了合理的多线程并行代码,那么对于那种处理大量数据的程序的性能的提升是非常可观的!
  在Java7之前,如果我们想要编写并行处理数据的代码,一般来说首先我们需要明确手动将数据分为多个部分,然后对每一部分使用一个线程进行计算,最后将计算的结果进行汇总,在此期间我们必须自己实现线程安全,代码实现起来非常麻烦。
  还好在Java7中新增了一个ForkJoinPool,又被称为分支/合并的框架,这个而框架是线程池框架的扩展,可以让我们更加轻松的编写并行数据处理代码。
  而在Java8中,新增的Stream流也支持并行的执行任务,并且使用起来比ForkJoinPool更加简单,并行流的底层实际上也是调用的ForkJoinPool,但是它已经帮我们做好了任务分割、结果汇总等操作,我们只需要某些方法启动即可!关于ForkJoinPool的原理我们在前面的文章已经讲解了,类似于分治算法,在此不再赘述!
  并行化操作流只需改变一个方法调用。如果已经有一个Stream对象,调用它的parallel方法就能让其拥有并行操作的能力。如果想从一个集合类创建一个流,调用parallelStream 就能立即获得一个拥有并行能力的流。另外sequential则是指定使用串行流。一个流只能应用一种模式,如果同时调用了parallel和sequential 方法,最后调用的那个方法起效。

  我们使用串行流和并行流对reduce方法进行测试:

/**
 * @author lx
 */
public class ParallelTest {


    @Test
    public void test1() {
        System.out.println("串行流");
        //串行流
        System.out.println(Stream.of("s", "qq", ";;", ".", ".", ".", ".").reduce("-", (x, y) -> {
            System.out.println(Thread.currentThread().getName());
            return x + y;
        }));

    }

    @Test
    public void test2() {
        System.out.println("parallel并行流");
        //添加parallel方法,变成并行流
        System.out.println(Stream.of("s", "qq", ";;", ".", ".", ".", ".").parallel().reduce("-", (x, y) -> {
            System.out.println(Thread.currentThread().getName());
            return x + y;
        }));

    }


    @Test
    public void test7() {
        System.out.println("串行流");
        Optional<Integer> reduce = Arrays.asList(1, 2, 3, 4, 5, 6, 7).stream().reduce((x, y) -> {
            System.out.println(Thread.currentThread().getName());
            return x + y;
        });
        reduce.ifPresent(System.out::println);
    }


    @Test
    public void test8() {
        System.out.println("parallelStream并行流");
        Optional<Integer> reduce = Arrays.asList(1, 2, 3, 4, 5, 6, 7).parallelStream().reduce((x, y) -> {
            System.out.println(Thread.currentThread().getName());
            return x + y;
        });
        reduce.ifPresent(System.out::println);
    }


    @Test
    public void test3() {
        System.out.println("串行流");

        //串行流
        System.out.println(Arrays.asList("s", "qq", ";;", ".", ".", ".", ".").stream().reduce("-", (x, y) -> {
            System.out.println(Thread.currentThread().getName());
            return x + y;
        }));
    }


    @Test
    public void test4() {
        System.out.println("parallelStream并行流");
        //并行流
        System.out.println(Arrays.asList("s", "qq", ";;", ".", ".", ".", ".").parallelStream().reduce("-", (x, y) -> {
            System.out.println(Thread.currentThread().getName());
            return x + y;
        }));
    }


    @Test
    public void test30() {
        System.out.println("串行流");

        //串行流
        System.out.println(Arrays.asList("s", "qq", ";;", ".", ".", ".", ".").stream().reduce("-", (x, y) -> {
            System.out.println(Thread.currentThread().getName());
            return x + y;
        }, (x, y) -> x + y));
    }

    @Test
    public void test31() {
        System.out.println("并行流");

        //串行流
        System.out.println(Arrays.asList("s", "qq", ";;", ".", ".", ".", ".").parallelStream().reduce("-", (x, y) -> {
            System.out.println(Thread.currentThread().getName());
            return x + y;
        }, (x, y) -> {
            System.out.println(Thread.currentThread().getName());
            return x + y + x;
        }));
    }


    @Test
    public void test5() {
        System.out.println("sequential串行流");
        //串行流
        System.out.println(Arrays.asList("s", "qq", ";;", ".", ".", ".", ".").parallelStream().sequential().reduce("-", (x, y) -> {
            System.out.println(Thread.currentThread().getName());
            return x + y;
        }));
    }

    @Test
    public void test6() {
        System.out.println("sequential串行流");

        //串行流
        System.out.println(Arrays.asList("s", "qq", ";;", ".", ".", ".", ".").stream().parallel().sequential().reduce("-", (x, y) -> {
            System.out.println(Thread.currentThread().getName());
            return x + y;
        }));
    }
}

  • 发表于 2020-09-16 17:04
  • 阅读 ( 17 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
NX小编
NX小编

995 篇文章

作家榜 »

  1. NX小编 995 文章
  2. 58沈剑 309 文章
  3. 奈学教育 131 文章
  4. 李希沅 | 奈学教育 28 文章
  5. 江帅帅 | 奈学教育 27 文章
  6. 林淮川 | 奈学教育 12 文章
  7. 科技热点 10 文章
  8. 邱鹏超 2 文章