繁体   English   中英

Java8 stream()。map()。reduce()实际上是map reduce

[英]Java8 stream().map().reduce() is really map reduce

我在使用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();

stream().map().reduce() 不是并行的,因此单个线程作用于该流。

你必须添加parallel或在其他情况下parallelStream (依赖于API,但它同样的事情)。 默认情况下使用并行您将获得可用处理器数量-1; 但是在ForkJoinPool#commonPool也使用了主线程; 因此通常会有2、4、8个线程等。要检查将得到多少,请使用:

Runtime.getRuntime().availableProcessors()

您可以使用自定义的游泳池,只要你想获得尽可能多的线程,如图所示这里

还要注意,整个管道并行运行,而不仅仅是 map操作。

关于何时使用和何时不使用并行流没有黄金法则,最好的方法是测量。 但也有明显的选择,像10元流-这是太少有从并行任何实际的好处。

所有并行流都使用公共的fork-join线程池,如果您提交了一个长时间运行的任务,则可以有效地阻塞该池中的所有线程。 因此,您将阻止所有其他使用并行流的任务。

只有两种方法可以确保这种情况永远不会发生。 第一个是确保提交到公共fork-join池的所有任务都不会卡住,并且会在合理的时间内完成。 但是说起来容易做起来难,尤其是在复杂的应用程序中。 另一个选择是不使用并行流,直到Oracle允许我们指定要用于并行流的线程池。

用例假设您有一个集合(列表),该集合在应用程序开始时加载了值,并且在以后的任何时间都没有向其添加新值。 在上述情况下,您可以使用并行流而无需担心。

不用担心流是高效和安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM