从Java线程转向Scala Actors

4
我有一个Java应用程序,其中包含各种代理(Java算法),它们侦听消息并处理它们。每个代理在单个线程上执行这些消息,其中这些消息被添加到阻塞队列中以逐个进行处理。这个单个消息的处理涉及与远程机器的I/O。随着时间的推移,由于Java中固有的Bug,这些线程一个接一个地挂起。他们说这个问题已经解决了,但事实并非如此。我已经在所有最新的Java版本上运行它并尝试了一个月的所有解决方法。因此,我计划转向Scala Actors。
以下是我的问题:
  1. 在Scala Actors中是否可能实现以上要求,并能够克服Java bug?
  2. 如果可能,请提供简单概述:)
  3. P.S:我一直在阅读《Programming in Scala》这本书,以获取语法和基本功能。

3个回答

1
  1. 对于第一个问题,答案是肯定的,Scala Actors 通过其 Actor 并发模型克服了提到的 bug。我在过去的两周中一直在使用它,没有任何停机时间。Actors 轻量级、易于扩展,并且明显比我在 Java 中使用的线程代理执行得更快。奇怪的是,内存消耗也下降了。

  2. 现在来谈实现部分,一旦你掌握了 Scala 的基础知识,编写 Actors 就很容易了。如果你正在使用 Eclipse + Maven 插件,m2eclipse-scala 是开始的地方。我已经成功地使用那里提到的步骤构建了一个 OSGi bundle。Scala IDE 还有待改进,编写代码有点麻烦。

  3. 现在来谈 Scala Actors,处理它们的消息收件箱很困难。访问它们受到限制,当消息到达速度高于 Actor 处理速度时,它们似乎很容易出现内存不足的情况。Akka Actors 在这方面肯定具有优势,因为它们使我们能够设置最大邮箱大小、邮箱推送超时等,或者你可以拥有自己的收件箱实现。

感谢您的帮助。

sanre6


1

你提到的错误是一个jvm bug。因此,如果你在同一个JVM上使用“相同”的代码,你仍然会遇到这个bug。Scala仍然运行在JVM上,所以你仍然有可能遇到相同的bug。

Scala Actors可能不会以相同的方式使用JVM。但你不能保证任何事情。试一试吧。


是的,Scala可以在JVM上运行。但是它不使用Java所使用的共享状态和锁定模型。因此,我认为使用Actor并发模型应该可以克服所提到的问题。 - sanre6
@sanre6 是的,那正是我的观点。但在尝试之前你无法知道。 - Matthew Farwell

1
如果你刚开始接触Actor模型,我强烈推荐使用akka.io的actors包。当我开始尝试时,在使用标准Scala远程actors库时遇到了一些问题。我也听说过,随着时间的推移,akka actor实现将取代当前在Scala标准库中的实现。
这并没有直接回答你的问题,但基于Actor的并发编程要比管理自己的关键部分简单得多,至少这是我的经验。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接