并行流parallelStream

来源:互联网 发布:拉伸片的编程 编辑:程序博客网 时间:2024/06/07 03:03
1.并发与并行的区别:

并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行。但在任一个时刻点只有一个程序在处理机上运行
并行: 在同一个时刻,多核处理多个任务。把工作拆分,同时在多核CPU上执行

2.例子:   
import java.util.ArrayList;  import java.util.List;  import java.util.UUID;  import java.util.concurrent.TimeUnit;  import org.junit.Test;  /**     Parallel Streams , 并行流提高性能     流可以是顺序的也可以是并行的。顺序流的操作是在单线程上执行的,而并行流的操作是在多线程上并发执行的。  */  public class ParallelStreams {      int max = 1000_000;      List<String> values;      public ParallelStreams(){          //创建一个包含唯一元素的大容器:                 values = new ArrayList<String>();          for(int i=max; i>0; i--){              UUID uuid = UUID.randomUUID();              values.add(uuid.toString());                      }      }      //测试排序这些元素需要多长时间。      //Sequential Sort, 采用顺序流进行排序      @Test      public void sequentialSort(){             long t0 = System.nanoTime();          long count = values.stream().sorted().count();          System.err.println("count = " + count);          long t1 = System.nanoTime();          long millis  = TimeUnit.NANOSECONDS.toMillis(t1 - t0);          System.out.println(String.format("sequential sort took: %d ms", millis));            //sequential sort took: 1932 ms      }      //parallel Sort, 采用并行流进行排序      @Test      public void parallelSort(){           long t0 = System.nanoTime();          long count = values.parallelStream().sorted().count();          System.err.println("count = " + count);          long t1 = System.nanoTime();          long millis  = TimeUnit.NANOSECONDS.toMillis(t1 - t0);          System.out.println(String.format("parallel sort took: %d ms", millis));            //parallel sort took: 1373 ms 并行排序所花费的时间大约是顺序排序的一半。      }  }  
public static void main(String[] args) {    List<Integer> array = new ArrayList<Integer>() {{        add(1);        add(2);        add(3);        add(4);        add(5);    }};    array.stream().forEach(u -> System.out.print(u + ","));//按照正常顺序输出 1,2,3,4,5,    System.out.println("----------parallel执行分割线------------");    array.parallelStream().forEach(u -> System.out.print(u + ","));//随机输出 3,5,4,1,2,

3.影响并行流的主要五个因素

3.1数据大小

输入数据的大小会影响并行化处理,当只有足够大、每个数据处理管道花费的时间足够多时,并行化才有意义

3.2源数据结构

一般都是基于集合进行并行化

3.3装箱

处理基本类型比处理装箱类型要快

3.4核的数量

只有在多核的机器上使用才有意义,并且是运行时能够使用的多少核

3.5单元处理开销

原先处理耗时较长,使用并行化才有意义

原创粉丝点击