从Java多线程到Scala Akka参与者
我是Scala的新手,所以我需要帮忙。我用Java做了一个例子,我必须用Scala创建同样的东西。例如:从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.
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
}