相关疑难解决方法(0)

Java 8,在流中使用.parallel会导致OOM错误

在Java 8 In Action,7.1.1节中,作者声明通过添加函数,流可以从并行处理中受益.parallel().它们提供了一种简单的方法parallelSum(int)来说明这一点.我很好奇它看起来有多好,所以我执行了这段代码:

package lambdasinaction.chap7;

import java.util.stream.Stream;

public class ParallelPlay {

    public static void main(String[] args) {
        System.out.println(parallelSum(100_000_000));
    }

    public static long parallelSum(long n) {
        return Stream.iterate(1L, i -> i + 1)
                .limit(n)
                .parallel()
                .reduce(0L, Long::sum);
    }
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,我收到了这个错误:

Exception in thread "main" java.lang.OutOfMemoryError
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.util.concurrent.ForkJoinTask.getThrowableException(Unknown Source)
    at java.util.concurrent.ForkJoinTask.reportException(Unknown Source)
    at java.util.concurrent.ForkJoinTask.invoke(Unknown Source)
    at java.util.stream.SliceOps$1.opEvaluateParallelLazy(Unknown Source)
    at java.util.stream.AbstractPipeline.sourceSpliterator(Unknown Source)
    at java.util.stream.AbstractPipeline.evaluate(Unknown …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing java-8 java-stream

1
推荐指数
1
解决办法
1153
查看次数

在多线程情况下使用限制流的最佳方式性能

我观看了JoséPaumard在InfoQ上的演讲:http: //www.infoq.com/fr/presentations/jdk8-lambdas-streams-collectors(法语)

问题是我被困在这一点上.要使用流和多线程收集1M Long ,我们可以这样做:

Stream<Long> stream = 
  Stream.generate(() -> ThreadLocalRandom.current().nextLong()) ;

List<Long> list1 = 
  stream.parallel().limit(10_000_000).collect(Collectors.toList()) ;
Run Code Online (Sandbox Code Playgroud)

但考虑到线程总是在检查上述限制以阻碍性能.

在那次演讲中我们也看到了第二个解决方案:

Stream<Long> stream = 
  ThreadLocalRandom.current().longs(10_000_000).mapToObj(Long::new) ;

List<Long> list = 
  stream.parallel().collect(Collectors.toList()) ;
Run Code Online (Sandbox Code Playgroud)

它似乎是更好的表现.

所以这是我的问题:为什么第二个代码更好,是否有更好的,或者至少成本更低的方法呢?

java random multithreading java-8 java-stream

1
推荐指数
1
解决办法
663
查看次数