【问题标题】:Java vs Scala Threads - under the covers in the JVMJava 与 Scala 线程 - 在 JVM 的幕后
【发布时间】:2013-10-25 17:43:39
【问题描述】:

在尝试比较在 Java 和 Scala 中实现的相同简单问题的“执行特性”时,我发现 Java 版本中的线程类运行在名称如下的线程上 Thread-x,而 Scala 演员在名称如 ForkJoinPool-x-worker-y 的线程上运行。 非线程 Java 类和非参与者 Scala 类始终在主线程上运行。

下面的日志片段将说明:

Java version: Scoord thread class running in Thread[Thread-0,5,main]
              Semaphore class running in Thread[main,5,main]

Scala version: Scoord actor running in Thread[ForkJoinPool-1-worker-13,5,main]
               Semaphore class running in Thread[main,5,main]

除了是不同类的实例之外,这些线程之间有什么区别 - Thread 类与 ForkJoinWorkerThread 类?工作线程如何映射到 O/S 内核线程执行?

任何关于用于 JVM 线程的命名约定的解释也将不胜感激。

这两个实现都在相同版本的 JVM 上运行 - HotSpot (TM) 64 位服务器 VM(内部版本 23.21-b01,混合模式)。硬件是 64 位 4 核 Acer 笔记本电脑,8G内存,运行 Windows 8。

【问题讨论】:

    标签: java multithreading scala jvm


    【解决方案1】:

    Scala Actor 不是线程!它们是对象,异步处理事件 - 它们可能在不同的线程中运行。

    Scala actor 是一个类似于Communicating Sequential Processes 的概念,与threads 不同。尽管如此,线程通常在 CSP 实现中使用,请参阅 Go language。

    【讨论】:

    • 但它(CSP 实现)最终不是通过 Thread 执行的吗?甚至“Goroutines”也需要线程?
    • @RawleRamkeesoon,是的,我在答案中说过。线程可以看作是实现类 CSP 解决方案的底层机制。
    • 明白。线程是实现任何解决方案的“低级机制”。我在这个问题中所追求的是 Scala 参与者(CSP 或其他可能是什么)实际上如何映射到执行的 O/S 线程。
    • @RawleRamkeesoon,演员如何映射到操作系统线程取决于您用于这些特定演员的dispatcher。默认调度程序将其所有参与者映射到单个线程池,默认线程池是 Akka 库中特殊的 fork-join 线程池。因此,您可以查看此线程池的实现,以找出将任务映射到线程的确切策略。 IIUC,这是链接:github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/…
    • Dispatcher 是 Scala Actor 运行时系统还是 JVM 的一部分?目前我只对 Scala 演员感兴趣,尽管我知道 Akka 演员库可能会在 2.x 中取代它。
    【解决方案2】:

    没有scala 线程——scala 使用完全相同的java 线程。所以mapping to OS threads have the same rules。 Actor 构建在相同的并发原语之上,尤其是线程池,因此您基本上是在比较线程池和裸线程。 Actor 的默认线程池是 fork-join 池——the main feature of it among other kinds of thread pools is work stealing。

    话虽如此,没有什么能阻止您从 java 中使用 FJP(java 7 上的开箱即用,或 java 6 中的as pluggable library)并观察相同的结果和命名(但显然是可怕的低级 api )。

    【讨论】:

    • 从部分日志中可以看出,Scala actor 在 FJP 线程上运行,而纯 Java 线程类在 JVM (?) 线程上运行。
    • @RawleRamkeesoon 特别是,actor 在 FJP 线程上运行,FJP 线程是 Java 线程,也就是由 OS 线程支持的 JVM 线程。如果您使用 java 中的 FJP 框架,您将看到相同的日志语句。
    • 抱歉过早按下返回键。我真正想要的是两个线程之间的区别——FJP 线程和 Thread-x 类型线程——以及它们如何被 O/S 内核线程调度执行。
    • @RawleRamkeesoon 完全没有区别,FJP 线程只是一堆普通的 java[/os] 线程,它们联合在同一个保护伞下。在 unix 系统上将应用抢占式调度。 Java threads are OS threads.
    • 这些答案对阐明我对JVM-O/S环境的理解很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多