java.lang.ArrayIndexOutOfBoundsException:使用并行流将元素添加到列表时

问题描述 投票:0回答:1

我正在努力优化csv文件的某些处理,因此试图加快某些Jakcson的实现。所以我有:

List<T> testResults=new ArrayList();
Stream<T> testStream= Streams.stream(TestIterator);
testStream.parallel().forEach(p->testResults.add(p));

这里我得到:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 360145
at java.util.ArrayList.add(Unknown Source)
at xml_test.opencsv.App.lambda$1(App.java:85)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Unknown Source)
at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.util.stream.ForEachOps$ForEachTask.compute(Unknown Source)
at java.util.concurrent.CountedCompleter.exec(Unknown Source)
at java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
at java.util.concurrent.ForkJoinTask.doInvoke(Unknown Source)
at java.util.concurrent.ForkJoinTask.invoke(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(Unkno

任何想法是怎么回事?如果我删除了“平行”字样,它会起作用,但速度非常慢

java stream
1个回答
1
投票

ArrayList不是线程安全的实现。一种解决方案是将其包装为ArrayList

© www.soinside.com 2019 - 2024. All rights reserved.