从Java多线程到Scala Akka参与者

从Java多线程到Scala Akka参与者,java,multithreading,scala,akka,actor,Java,Multithreading,Scala,Akka,Actor,我是Scala的新手,所以我需要帮忙。我用Java做了一个例子,我必须用Scala创建同样的东西。例如: import java.util.ArrayList; public class Z { public static void main(String[] args) { A a=new A(); B b=new B(a); a.setB(b); a.addMessage("A1"); a.

我是Scala的新手,所以我需要帮忙。我用Java做了一个例子,我必须用Scala创建同样的东西。例如:

import java.util.ArrayList;

public class Z 
{
    public static void main(String[] args) 
    {
        A a=new A();
        B b=new B(a);
        a.setB(b);
        a.addMessage("A1");
        a.addMessage("A2");
        a.addMessage("A3");
        b.addMessage("B1");
        b.addMessage("B2");
        b.addMessage("B3");
        b.addMessage("B4");
        a.start();
        b.start();
    }   
}

class A extends Thread
{
    ArrayList<String> msgs=new ArrayList<String>();
    B b;

    public void setB(B tb)
    {
        b=tb;
    }

    public void run() //It's like a send() method
    {
        for (int i=0; i<msgs.size(); i++)
        {
            final String msg=msgs.get(i);
            new Thread()
            {
                public void run() 
                {
                    b.receive(msg);
                }
            }.start();
        }
    }

    public void receive (String msg)
    {
        System.out.println("A received a message from B.");
    }

    public void addMessage(String message)
    {
        msgs.add(message);
    }
}

class B extends Thread
{
    ArrayList<String> msgs=new ArrayList<String>();
    A a;

    public B(A ta)
    {
        a=ta;
    }

    public void run() //It's like a send() method
    {
        for (int i=0; i<msgs.size(); i++)
        {
            final String msg=msgs.get(i);
            new Thread()
            {
                public void run() 
                {
                    a.receive(msg);
                }
            }.start();
        }
    }

    public void receive (String msg)
    {
        System.out.println("B received a message from A.");
    }

    public void addMessage(String message)
    {
        msgs.add(message);
    }
}

在两个
act()。我是否应该启动主体,然后在
act()
之外发送消息?

考虑以下Akka主体的实现。注意

  • run
    方法在此替换为
    SendAll
    消息
  • 可以通过将这种引用添加到
    SendAll
    ,简化在参与者之间传递的参与者引用
  • 代码简洁性的一个小改进是将每条文本消息封装到一个列表中
  • 参与者日志系统取代了
    println
因此,

import akka.actor.{ActorSystem, Props, Actor, ActorRef, ActorLogging}
import collection.mutable.ListBuffer

sealed trait Messaging
case class Add(msgs: List[String]) extends Messaging
case class Receive(msgs: String) extends Messaging
case class SendAll(dest: ActorRef) extends Messaging 


class Messenger extends Actor with ActorLogging {
  var messages = new ListBuffer[String]()

  def receive = {
    case Add(msgs)     => messages ++= msgs
    case Receive(msg)  => log.info(s"received $msg from ${sender.path}.")
    case SendAll(dest) => messages.foreach(dest ! Receive(_))
  }
}

object Main extends App {

  val system = ActorSystem("MessengerSystem")
  val aActor = system.actorOf(Props[Messenger], name = "aActor")
  val bActor = system.actorOf(Props[Messenger], name = "bActor")

  aActor ! Add(List("A1","A2","A3"))
  bActor ! Add(List("B1","B2","B3","B4"))

  aActor ! SendAll(bActor)
  bActor ! SendAll(aActor)

  system.shutdown
}

请查看中提供的示例
import akka.actor.{ActorSystem, Props, Actor, ActorRef, ActorLogging}
import collection.mutable.ListBuffer

sealed trait Messaging
case class Add(msgs: List[String]) extends Messaging
case class Receive(msgs: String) extends Messaging
case class SendAll(dest: ActorRef) extends Messaging 


class Messenger extends Actor with ActorLogging {
  var messages = new ListBuffer[String]()

  def receive = {
    case Add(msgs)     => messages ++= msgs
    case Receive(msg)  => log.info(s"received $msg from ${sender.path}.")
    case SendAll(dest) => messages.foreach(dest ! Receive(_))
  }
}

object Main extends App {

  val system = ActorSystem("MessengerSystem")
  val aActor = system.actorOf(Props[Messenger], name = "aActor")
  val bActor = system.actorOf(Props[Messenger], name = "bActor")

  aActor ! Add(List("A1","A2","A3"))
  bActor ! Add(List("B1","B2","B3","B4"))

  aActor ! SendAll(bActor)
  bActor ! SendAll(aActor)

  system.shutdown
}