我是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)
但它挂起,程序永远不会完成.
有人能解释一下为什么吗?
最好将挂起的整个程序发布出来。
我刚刚用 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工具。
如果程序中有一些代码阻止其执行,您可以分析为什么您的程序由于捕获的线程转储而被挂起。
| 归档时间: |
|
| 查看次数: |
471 次 |
| 最近记录: |