5

在尝试比较在 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,混合模式)。硬件是具有 8G 内存的 64 位 4 核 Acer 笔记本电脑,运行 Windows 8。

4

2 回答 2

4

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

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

于 2013-10-17T09:55:00.413 回答
3

没有scala 线程—— scala 使用相同的 java 线程。因此映射到 OS 线程具有相同的规则。Actor 构建在相同的并发原语之上,尤其是线程池,因此您基本上是在比较线程池和裸线程。Actor 的默认线程池是 fork-join 池——它在其他类型的线程池中的主要特征是工作窃取

在此处输入图像描述

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

于 2013-10-17T11:04:02.500 回答