[英]Parallel stream doesn't look like working in parallel, completely
Java8 parallelStream无法完全并行工作。 在我的计算机中,当任务计数小于处理器计数时,java8集的parallelStream没有使用足够的线程。
public class ParallelStreamSplitTest {
@Test
public void setStreamParallelTest() {
System.out.printf("Total processor count : %d \n", Runtime.getRuntime().availableProcessors());
long start = System.currentTimeMillis();
IntStream.range(1, 8).boxed().collect(Collectors.toCollection(HashSet::new)).parallelStream().forEach((index) -> {
System.out.println("Starting " + Thread.currentThread().getName() + ", index=" + index + ", " + new Date());
try {
Thread.sleep(1000);
} catch (Exception e) {
}
});
long end = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + "'s elapsed time : " + (end - start));
}
@Test
public void intStreamParallelTest() {
System.out.printf("Total processor count : %d \n", Runtime.getRuntime().availableProcessors());
long start = System.currentTimeMillis();
IntStream.range(1, 8).parallel().forEach(index -> {
System.out.println("Starting " + Thread.currentThread().getName() + ", index=" + index + ", " + new Date());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
});
long end = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + "'s elapsed time : " + (end - start));
}
}
在我的代码中,setStreamParallelTest花费4秒,而intStreamParallelTest花费1秒。
我希望setStreamParallelTest也可以在1秒内完成。 是虫子吗?
我的Web应用程序需要并行调用另一个api服务器。 所以我使用并行流来调用api。
Sets.newHashSet(api1, api2, api3, api4).parallelStream().forEach(api -> callApiSync(api))
我认为绑定到我的服务器的所有请求都共享一个fork-join池。 因此,当api的响应之一缓慢时,这看起来很危险。
这是正确的吗?
parallelStream
的合同说:
返回与此集合为源的可能并行的Stream。 此方法允许返回顺序流。
如果要并行调用多个任务,请使用ExecutorService
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.