Scala的演员,java的等价物是什么?权衡?

时间:2012-11-29 15:50:33

标签: java scala concurrency actor

我正在阅读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.naildrivin5.com/scalatour/wiki_pages/ActorsAndConcurrency

与Java相同的模式是什么样的?我理解在Java中这样做会更加麻烦。

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

3 个答案:

答案 0 :(得分:7)

查看akka框架。有了它,你将拥有Java中的Actor Model的强大功能。

答案 1 :(得分:4)

正如其他人提到的那样,Akka可能是最好的候选者,因为它已经用Scala编写了,它的完成方式也使得它可以从Java中轻松访问。作为旁注,Akka的实施将取代目前的实施。

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

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

答案 2 :(得分: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创建一个现有的actor框架(有很多)。 要明智地选择,您必须回答以下问题:

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

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