Scala Parallel Print悬挂控制台

Isr*_*inc 8 foreach scala par

我是Scala世界的新手,我正在尝试一本书的练习.所以,我有一个以顺序和并行方式打印矢量的例子.前者完美运行,后者挂起控制台.

val v = Vector.range(0, 10)
v.foreach(println)
Run Code Online (Sandbox Code Playgroud)

代码输出

0123456789
Run Code Online (Sandbox Code Playgroud)

但是如果我使用相同的代码,而不是使用foearch,使用par,它会冻结控制台

val v = Vector.range(0,10)
v.par.foreach(println)
Run Code Online (Sandbox Code Playgroud)

我正在使用的书说输出应该是这样的:

5678901234    
Run Code Online (Sandbox Code Playgroud)

但它挂起,程序永远不会完成.

有人能解释一下为什么吗?

Mat*_* I. 1

最好将挂起的整个程序发布出来。

我刚刚用 scala 2.12.8 和 jvm 1.8.0_161 测试了它:

object MainClassss {
  def main(args: Array[String]): Unit = {
    val v = Vector.range(0,10)
    (0 to 999999).foreach(_ => v.par.foreach(println))
  }
}
Run Code Online (Sandbox Code Playgroud)

该程序执行良好并具有输出并且没有挂起。

如果您的程序重现了上述问题,您需要通过以下方式进行线程转储:

$ jstack <PID>
Run Code Online (Sandbox Code Playgroud)

其中 PID 是进程 ID。

或者你可以使用jvisualvmjvm工具。

如果程序中有一些代码阻止其执行,您可以分析为什么您的程序由于捕获的线程转储而被挂起。