相关疑难解决方法(0)

如何确保java8流中的处理顺序?

我想处理XMLjava对象中的列表.我必须确保按顺序处理所有元素.

因此sequential,stream我应该每次使用我吗? list.stream().sequential().filter().forEach()

或者只要我不使用并行性就足以使用流? list.stream().filter().forEach()

java java-8 java-stream

130
推荐指数
2
解决办法
7万
查看次数

在并行流上调用顺序会使所有先前的操作顺序进行

我有一个重要的数据集,并希望调用缓慢但干净的方法,而不是调用快速方法,副作用对第一个结果.我对中间结果不感兴趣,所以我不想收集它们.

显而易见的解决方案是创建并行流,进行慢速呼叫,再次使流顺序,并进行快速呼叫.问题是,所有代码都在单线程中执行,没有实际的并行性.

示例代码:

@Test
public void testParallelStream() throws ExecutionException, InterruptedException
{
    ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);
    Set<String> threads = forkJoinPool.submit(()-> new Random().ints(100).boxed()
            .parallel()
            .map(this::slowOperation)
            .sequential()
            .map(Function.identity())//some fast operation, but must be in single thread
            .collect(Collectors.toSet())
    ).get();
    System.out.println(threads);
    Assert.assertEquals(Runtime.getRuntime().availableProcessors() * 2, threads.size());
}

private String slowOperation(int value)
{
    try
    {
        Thread.sleep(100);
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }
    return Thread.currentThread().getName();
}
Run Code Online (Sandbox Code Playgroud)

如果我删除sequential,代码按预期执行,但显然,非并行操作将在多个线程中调用.

你能推荐一些关于这种行为的引用,或者某些方法可以避免临时收集吗?

java multithreading forkjoinpool java-stream

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

如何限制Stream按顺序运行,并阻止它并行运行?

我有一个方法返回从自定义spliterator生成的流; 分裂器不是安全的.由于分裂器不是踏板安全的,并且它保持状态,我想防止它并行运行.有没有办法阻止返回的流并行运行?

我无法找到任何执行此操作的文档或示例.我确实sequential()BaseStream类上找到了一个方法,但这似乎并没有阻止用户调用parallel()以获得并行流.

java java-stream spliterator

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