java - 并行流看起来不像完全并行工作
问题描述
1、Set的parallelStream没有使用足够的线程。
Java8 parallelStream 不能完全并行工作。在我的计算机中,当任务的计数小于处理器的计数时,java8 set 的 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 秒内完成。是虫子吗?
2. web应用程序中可以使用并行流调用另一个api吗?如果是错的,为什么?
我的 Web 应用程序需要并行调用另一个 api 服务器。所以我使用并行流来调用api。
Sets.newHashSet(api1, api2, api3, api4).parallelStream().forEach(api -> callApiSync(api))
我认为所有发往我的服务器的请求都共享一个 fork-join 池。所以,当其中一个 api 的响应很慢时,它看起来很危险。
这是对的吗?
解决方案
合同parallelStream
说:
返回以该集合为源的可能并行 Stream。此方法允许返回顺序流。
如果要并行调用多个任务,请使用ExecutorService
.
推荐阅读
- r - 使用共享轴在图中排列面板
- pine-script - 如何使用 pine 脚本在交易视图中绘制买卖双方的数量?
- jira - 我将如何从 JIRA 中删除我的项目之一?
- xamarin - Xamarin iOS - 找不到图像
- c# - 如何使用 Selenium 和 C# 定位 li 标签内的元素
- c - 学习 c 的艰难方法 ex29 编译/链接问题
- javascript - 使用字符串(非 HTML)以表格格式显示对象数组
- .net - 如何通过回车符(vbCr)进行拆分,并且仍将其保留在最终的字符串数组中?
- node.js - 如何获取微服务中加入的数据列表?
- java - 无法重新加载 Maven 项目:无法重新连接。java.lang.RuntimeException:无法重新连接