7

我目前正在学习 Scala 中的演员。本书推荐使用react方法而不是receive,因为它允许系统使用更少的线程。

我已经阅读了为什么创建线程很昂贵。但是,一旦你有了线程(在初始化之后应该为 Scala 中的演员系统保留),让它们周围存在代价高昂的原因是什么?

主要是内存消耗吗?还是有其他原因?

4

3 回答 3

10

使用多个线程可能比您预期的要昂贵,因为:

  • 每个线程都消耗堆外的内存,这限制了 JVM 可以创建多少线程;
  • 从一个线程切换到另一个线程会消耗一些 CPU 时间,因此如果您有可以在单个线程中执行的活动,您将节省 CPU 周期;
  • 如果有更多线程,则有 JVM 调度程序有更多工作要做。同样适用于底层操作系统调度程序;
  • 最后,在 CPU 密集型任务中使用比 CPU 内核更多的线程毫无意义,使用比 I/O 活动(例如,网络客户端)更多的 I/O 线程也毫无意义。
于 2012-05-08T14:03:31.383 回答
2

除了周围有线程的内存开销(可能很小也可能不小),周围有更多线程通常还意味着调度将有更多的元素需要考虑,以便选择哪个线程将获得 CPU下一个。

一些操作系统/JVM 也可能对可以同时存在的线程数量有限制。

最终,它是小额间接费用的积累,最终可能占很大比例。而且这些都不是 Java 特有的。

于 2012-05-08T14:02:24.457 回答
2

有线程并不“昂贵”。当然,这有点取决于我们在这里谈论的数量。我怀疑数十亿个线程会是个问题。我认为一般来说,拥有很多线程被认为是昂贵的,因为你可以做更多的并行工作,所以 CPU 上升,内存上升等等......但如果它们得到正确管理(例如池化以保护系统资源),那么没关系。JVM 不一定使用本机线程,因此 Java 线程不一定映射到 OS 本机线程(例如,查看绿色线程或轻量级线程)。在我看来,JVM 中的线程没有隐含的成本。成本来自于糟糕的线程管理和不小心分配资源而过度使用资源。

于 2012-05-08T14:04:14.063 回答