我在某处使用stream().map().reduce()看到了这段代码.
这个map()函数真的可以并行工作吗?如果是,那么它可以为map()函数启动多少个最大线程数?
如果我对下面的特定用例使用parallelStream()而不仅仅是stream(),该怎么办?
任何人都可以给我一个很好的例子,说明不使用parallelStream()的地方
下面的代码只是从tCode中提取tName并返回逗号分隔的String.
String ts = atList.stream().map(tcode -> {
return CacheUtil.getTCache().getTInfo(tCode).getTName();
}).reduce((tName1, tName2) -> {
return tName1 + ", " + tName2;
}).get();
Run Code Online (Sandbox Code Playgroud)
这stream().map().reduce()是不平行的,从而一个单一的线程作用于流.
你必须添加parallel或在其他情况下parallelStream(取决于API,但它是相同的事情).默认使用parallel ,您将获得可用处理器的数量 - 1; 但主线程也用于ForkJoinPool#commonPool; 因此通常会有2个,4个,8个线程等.要查看您将获得多少线程,请使用:
Runtime.getRuntime().availableProcessors()
Run Code Online (Sandbox Code Playgroud)
您可以使用自定义的游泳池,只要你想获得尽可能多的线程,如图所示这里.
还要注意,整个管线并行,无法运行只是在map操作.
关于何时使用以及何时不使用并行流没有黄金法则,最好的方法是测量.但是有明显的选择,比如10个元素的流 - 这种方法太少,无法从并行化中获得任何实际好处.