Java vs Scala Threads - 在JVM的封面下

时间:2013-10-17 09:44:59

标签: java multithreading scala jvm

在尝试比较Java和Scala中实现的同一个简单问题的“执行特性”时,我发现Java版本中的线程类在名称类似的线程上运行 Thread-x ,而Scala actor在名称为 ForkJoinPool-x-worker-y 的线程上运行。 非线程Java类和非actor actor 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。

2 个答案:

答案 0 :(得分:4)

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

Scala actor是一个类似于Communicating Sequential Processes的概念,与threads不同。然而,线程通常用于CSP实现,请参阅Go language

答案 1 :(得分:3)

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

enter image description here

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