java - 与 Scala/Akka Actor 相比,Java 线程有多重?

标签 java multithreading performance scala akka

我只是在比较 scala actor 与 java 线程的性能。

我很惊讶地看到差异,我观察到使用我的系统我最多只能产生约 2000 个线程(一次运行)但使用相同的系统我能够产生约 500,000 个 scala Actor 。

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

你能解释一下 java 线程是如何比 scala/akka Actor 重这么多的吗? scala-actor 如此轻量的关键因素是什么?

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

谢谢。

最佳答案

Scala 角色(包括 Akka 变种)使用 Java 线程。没有什么神奇之处:同时运行几千个线程对于大多数桌面计算机来说都是一个问题。

Actor 模型允许按需唤醒的 Actor 不占用线程,除非他们有工作要做。一些问题可以有效地建模为大量 sleep 代理等待获得一些工作,他们会相对快速地完成它然后重新进入休眠状态。在这种情况下,actor 是使用 Java 线程完成工作的一种非常有效的方式,尤其是当您拥有像 Akka 这样的库时,性能一直是高优先级。

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

所有可合理扩展的网络服务器都必须以某种方式解决这类问题;您可能不应该主要根据是否在幕后使用 Actor 来决定网络服务器,无论您使用什么,您都可以自己添加 Actor 。

关于java - 与 Scala/Akka Actor 相比,Java 线程有多重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15553857/

相关文章:

java - 当父进程退出时,如何使子进程退出?

c# - C#和SQL Server中嵌套using的使用

c# - ToDictionary() 是否创建副本或引用?

.net - IronPython 性能

python - 我怎样才能使这个循环更有效率?

java assertEquals 集合

java - 自定义 JButton : setText doesn't have effect

Java 8 List<V> 到 Map<K, V> 覆盖重复键

通过静态声明启动时,Java lambda 陷入死锁

java - java.lang.reflect.Array 的性能