从java线程转移到scala actor

时间:2011-11-03 10:19:31

标签: java multithreading scala scala-2.8 actor

我有一个java应用程序,它有各种代理(Java Algo),它们可以监听消息并处理它们。每个代理在单个线程上执行这些消息,其中这些消息被添加到阻塞队列中以便逐个处理。对单个消息的这种处理涉及与远程机器的i / o。由于java中固有的Bug,这些线程加时一个接一个地挂起。他们说这个bug是修复的,但不是,我已经在所有最新的java版本上运行它,并尝试了一个月的所有变通办法。所以,我打算转移到scala演员。

以下是我的问题:

  1. scala actor中是否可以满足上述要求,是否会克服java bug?
  2. 如果可能的话,简单概述如何做到:)

    P.S:我一直在阅读scala书中的编程,以获取语法和基本功能。

3 个答案:

答案 0 :(得分:1)

你引用的bug是一个jvm bug。因此,如果您在同一个JVM上使用“相同”代码,您仍会遇到该错误。 Scala仍在JVM上运行,因此您仍有机会遇到相同的错误。

Scala Actors可能不会以相同的方式运用JVM。但你无法保证任何事情。试试吧,看看。

答案 1 :(得分:1)

如果您刚刚开始使用actor模型,我强烈建议您使用akka.io中的actors包。当我开始涉足时,我在使用标准的Scala远程actor库时遇到了一些问题。我也听说过,akka actor实现将会替换Scala标准库中的当前实现。

这并没有解决你的问题本身,但是编写基于Actor的并发程序要比管理你自己的关键部分简单得多 - 至少这是我的经验。

答案 2 :(得分:1)

  1. 对于第一个问题答案是肯定的,scala演员确实克服了由于其演员并发模型而提到的错误。过去两周我一直在使用它,没有停机时间。 Actor是轻量级的,易于扩展,并且比我在java中的线程代理更快地执行。内存消耗也很奇怪。

  2. 现在,对于实现部分,一旦您了解了scala的基础知识,就可以轻松地编写actor。如果你正在使用eclipse + maven插件m2eclipse-scala,那就是开始的地方。我已经使用那里提到的步骤成功构建了一个osgi包。 scala ide是一项正在进行的工作,编写代码有点痛苦。

  3. 现在对于scala演员来说,使用他们的消息收件箱很难。访问它们受到限制,当消息进入的速率高于角色可以处理的速率时,它们似乎很容易失去记忆。 Akka演员通过使我们能够设置最大邮箱大小,mailbox-push-timeout..etc或者您可以拥有自己的收件箱实现,肯定有一个优势。

  4. 谢谢你的帮助

    sanre6