【发布时间】:2018-03-22 06:47:47
【问题描述】:
考虑一下parallel()和sequential()这两种测试方法:
@Test
public void parallel() throws Exception
{
System.out.println( "parallel start." );
IntStream.of( 0, 1 ).parallel().map( this::work ).findAny();
System.out.println( "parallel done." );
}
@Test
public void sequential() throws Exception
{
System.out.println( "sequential start." );
IntStream.of( 0, 1 ).map( this::work ).findAny();
System.out.println( "sequential done." );
}
private int work(int i)
{
System.out.println( "working... " + i );
Threads.sleepSafe( i * 1000 );
System.out.println( "worked. " + i );
return i;
}
Threads.sleepSafe() 是一个简单的 Thread.sleep() 包装器,它吞下异常并且如果传递了 0,则什么也不做。
运行测试方法时,结果如下:
sequential start.
working... 0
worked. 0
sequential done.
parallel start.
working... 1
working... 0
worked. 0
sleeping for 1000 ms ...
slept for 1000 ms.
worked. 1
parallel done.
sequential() 按我的预期运行,但 parallel() 没有:
我希望parallel() 中的findAny() 在work() 第一次返回时立即返回(即值0,因为它不休眠),但它只在work() 完成后返回值1.
为什么?
有没有办法让findAny() 在work() 第一次返回时立即返回?
【问题讨论】:
标签: java parallel-processing java-8 java-stream short-circuiting