1

我正在阅读有关 Scala 的演员的信息,所以说我们有类似的内容:

object Worker extends Actor {
  def act() {
    while(true) {
      receive {
        case "exit" => {
          println("exiting...")
          sender ! Exit
        }
        case s:String if s.startsWith("scp") => {
          println("Starting scp")
          Thread.sleep(2000)
          sender ! Done(s)
        }
        case s:String => {
          println("Starting " + s)
          sender ! Done(s)
        }
      }
    }
  }
}

http://www.naildrivevin5.com/scalator/wiki_pages/ActorsAndConcurrency

Java 的等效模式是什么样的? 我知道在 Java 中执行此操作要麻烦得多。

Scala 的演员是否有任何性能影响?当然,从我收集的内容中实现和理解都更容易,但好奇是否有任何权衡。

4

3 回答 3

7

看看akka框架。有了它,您将拥有 Java 中 Actor 模型的强大功能。

于 2012-11-29T15:55:20.310 回答
4

正如其他人提到的,Akka 可能是最好的候选者,虽然它是用 Scala 编写的,但它的编写方式也使得它可以从 Java 中访问。作为旁注,Akka 实现将在未来取代当前的实现。

此外,Scala actor 实现并不是语言本身的特性,只是标准库包含了该实现。

就性能影响而言,当前的 Scala 实现无论如何都不是那么好,所以这将是一个坏例子。但是,我不能强烈推荐 Akka 的文档:http: //doc.akka.io/docs/akka/2.0.4/

于 2012-11-29T16:14:50.313 回答
4

Scala 的actor(不与akka 的actor 混合)实际上是一个带有输入队列的线程,它的等价物可以在java 中轻松实现:

 interface Port<T>{
   public void send(T msg);
 }
 class StringMessage {
   String value;
   Port sender;
 }
 class Worker extends Thread implements Port<StringMessage>{
     ConcurrentLinkedQueue<StringMessage > q=new ConcurrentLinkedQueue<StringMessage >();

     public send(StringMessage m) {
       q.put(m);
     }

     public void run() {
        while(true) {
          StringMessage msg=q.take();
          String s=msg.value;
          if (s.equals("exit") {
             println("exiting...");
             msg.sender.send(Exit);
             return;
          } else if (s.startsWith("scp") {
             println("Starting scp")
             Thread.sleep(2000)
             msg.sender.send(Exit);
          } else {
             println("Starting " + s)
             msg.sender.send(Done(s));
          }
       }
    }
  }

这只是一个草图,要使其可行,您必须在通信线程之间开发合同和协议。或者您可以采用现有的 java 演员框架(有很多)。要明智地选择,您必须回答以下问题:

  • 演员应该基于线程或在线程池上执行的轻量级任务吗?线程消耗大量内存,但允许阻塞操作。最广为人知的 Akka 框架使用轻量级任务。

  • 演员模型对你来说足够了吗?经典actor有单个输入端口,更广泛的数据流模型允许actor节点有多个输入端口,并且当所有输入端口不为空时触发。这允许在另一个问题中构造“嵌套回调” 。Java 数据流框架很少见,我知道的唯一开源库是我的df4j。它允许基于线程和基于任务的 Actor 节点,并具有带有单个输入的子类 Actor。

于 2012-11-29T16:42:16.507 回答