java 8流和并行流之间的多线程差异
我使用Java8流和并行流编写了代码,用于使用自定义收集器执行聚合功能的相同功能。
当我使用htop
查看CPU使用情况时,它显示了所有CPU核心都用于“流”和“并行流”版本。因此,当使用list.stream()
时,它似乎也使用所有CPU。这里,就多核的使用而言,{
你可以在下面搜索框中键入要查询的问题!
我使用Java8流和并行流编写了代码,用于使用自定义收集器执行聚合功能的相同功能。
当我使用htop
查看CPU使用情况时,它显示了所有CPU核心都用于“流”和“并行流”版本。因此,当使用list.stream()
时,它似乎也使用所有CPU。这里,就多核的使用而言,{
# 1 楼答案
考虑以下程序:
您会注意到,此程序将按数字在列表中的顺序依次输出0到999之间的数字。如果我们把
stream()
改为parallelStream()
,情况就不一样了(至少在我的电脑上是这样):所有的数字都会被写入,但顺序不同。因此,显然,parallelStream()
确实使用了多个线程大多数现代操作系统甚至将单线程应用程序划分为多个内核(同一线程的部分可能在多个内核上运行,但当然不是同时运行),这一事实解释了
htop
。因此,如果您看到一个进程使用了多个内核,这并不意味着该程序必须使用多个线程此外,在使用多线程时,性能可能不会提高。同步的成本可能会使使用多线程的收益变得虚无。对于简单的测试场景,通常情况就是这样。例如,在上面的示例中,
System.out
是同步的。所以,尽管使用了多个线程,但实际上只能同时写入数字# 2 楼答案
在@Hoopje的回答中添加:
在使用
parallelStream ()
之前,请阅读以下内容:n
线程的简单ExecutionService提供了比并行流更好的性能李>你也可以阅读: Java Parallel Streams Are Bad for Your Health! | JRebel by Perforce