小编had*_*ddr的帖子

Java并行流只使用一个线程?

我正在使用最新的 Java 8 lambda 和并行流来处理数据。我的代码如下:

ForkJoinPool forkJoinPool = new ForkJoinPool(10);
List<String> files = Arrays.asList(new String[]{"1.txt"}); 
List<String> result = forkJoinPool.submit(() ->
    files.stream().parallel()
        .flatMap(x -> stage1(x)) //at this stage we add more elements to the stream
        .map(x -> stage2(x))
        .map(x -> stage3(x))
        .collect(Collectors.toList())
).get();
Run Code Online (Sandbox Code Playgroud)

该流以一个元素开始,但在第二阶段添加更多元素。我的假设是该流应该并行运行,但在这种情况下仅使用一个工作线程。

如果我从 2 个元素开始(即,我将第二个元素添加到初始列表中),则会生成 2 个线程来处理流,依此类推...如果我没有显式地将流提交到 ForkJoinPool,也会发生这种情况。

问题是:它的行为是否记录在案,或者在实施过程中可能会发生变化?有什么方法可以控制这种行为并允许更多线程,无论初始列表如何?

java parallel-processing fork-join java-8 java-stream

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