在并行流上按顺序调用使所有先前的操作按顺序
2022-09-02 21:11:28
我有一组重要的数据,并且想要调用慢速但干净的方法,而不是调用快速方法,并对第一个方法的结果产生副作用。我对中间结果不感兴趣,所以我不想收集它们。
显而易见的解决方案是创建并行流,进行慢速调用,使流再次连续,并进行快速调用。问题是,所有代码都在单线程中执行,没有实际的并行性。
示例代码:
@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();
}
如果我删除 ,代码按预期执行,但显然,非并行操作将在多个线程中调用。sequential
您能否推荐一些关于此类行为的参考资料,或者某种避免临时收集的方法?