与Scala / Akka演员相比,Java线程如何沉重?

时间:2013-03-21 17:09:58

标签: java multithreading performance scala akka

我只是比较了scala actors vs java threads的性能。

我惊讶地看到了差异,我观察到我的系统能够产生最多~2000个线程(一次只能生存)但是使用相同的系统我能够产生~50万个scala的演员。

两个程序都使用了大约81MB的JVM堆内存。

你能解释一下java线程如何比scala / akka演员更重吗? 使scala-actor重量轻的关键因素是什么?

如果我想获得最佳的可扩展性,我应该选择基于actor的Web服务器而不是基于Java的传统Web / app服务器,如JBoss或Tomcat吗?

感谢。

2 个答案:

答案 0 :(得分:39)

Scala actor(包括Akka种类)使用Java线程。毫无魔力:对于大多数台式机来说,同时运行的几千个线程是一个问题。

Actor模型允许唤醒按需演员,除非他们有工作要做,否则他们不会占用线程。一些问题可以有效地建模,因为许多睡眠代理等待工作,谁会相对快速地做,然后再回去睡觉。在这种情况下,演员是使用Java线程完成工作的一种非常有效的方式,特别是如果你有像Akka这样的性能优先的库。

Akka docs很好地解释了基础知识。

所有合理可扩展的Web服务器都必须以这种或那种方式解决这类问题;你可能不应该根据网络服务器的决定来决定是否使用演员,无论你使用什么,你都可以自己添加演员。

答案 1 :(得分:18)

Akka演员不等同于一个帖子。它更像是在线程池上执行的Callable

当消息被分派给actor时,该actor被放置在线程池上以处理该消息。完成后,池化线程可用于执行其他actor。