我正在阅读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的演员是否有任何性能影响?当然,从我收集的内容中实现和理解它会更容易,但是如果有任何权衡则很好奇。
答案 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。