akka---actor模型
2015-09-17 19:09
375 查看
本文转载自:http://www.blogbus.com/public/tb.php/4212/235916459/d5b305d875fff7ba454c396085a01156
只要稍微了解过一些Scala,这门JVM上广受关注的程序设计语言,你一定会对其中的一个Actor特性印象深刻。Actor是另一种进行并发计算的方式。通过在不同的Actor之间彼此发送消息,我们会惊喜地发现,那令人纠结的锁将不再困扰我们。
不过,那是Scala的世界,作为一个Java程序员难道只有艳羡的份吗?显然不是。Akka把Actor带到了Java世界。
实际上,Akka主要是以Scala编写的,但它很好地支持Java API,让所有特性对于Java程序员也唾手可得。即使相比于与Scala内建的Actor,Akka也不遑多让。Akka除了最基本的Actor特性外,它可以能在多台机器上透明地实现Actor,此外,还提供了很好的监管特性,这些都是Scala内建的Actor所不具备的。
说了那么多,让我们用一个Hello的例子和Akka打个招呼吧!
这个HelloWorld继承了UntypedActor,表明我们实现的是一个Actor。
其中的preStart是在启动这个Actor时调用的方法。在这里,我们创建了另一个Actor的实例。我们稍后会看到另一个Actor Greeter的实现。然后,我们调用tell方法给它发了一个消息,Greeter.Msg.GREET,后面的getSelf()给出了一个Actor的引用(ActorRef),用以表示发消息的Actor。这只是启动一个Actor,后面的部分才是更重要的。
onReceive方法是处理我们接收到消息的情况。这里我们看到,如果接收到的消息是一个Greeter.Msg.DONE,我们就会停下(stop)所有的处理,同样,getSelf()指明停下的目标,否则的话,就说我们没处理(unhandled)。
看完了一个Actor,或许你已经迫不及待地想看与它打交道的另一个Actor了,下面就是:
同样的Actor结构,我们已经在HelloWorld类里面看到了。在onReceive方法里,如果它接收到的消息是Msg.GREET,它就打印出“Hello World!”,然后,给发送者回复一条Msg.DONE。没处理的话,就说没处理。
就是这么简单!
好,万事具备,我们把它跑起来。
只要稍微了解过一些Scala,这门JVM上广受关注的程序设计语言,你一定会对其中的一个Actor特性印象深刻。Actor是另一种进行并发计算的方式。通过在不同的Actor之间彼此发送消息,我们会惊喜地发现,那令人纠结的锁将不再困扰我们。
不过,那是Scala的世界,作为一个Java程序员难道只有艳羡的份吗?显然不是。Akka把Actor带到了Java世界。
实际上,Akka主要是以Scala编写的,但它很好地支持Java API,让所有特性对于Java程序员也唾手可得。即使相比于与Scala内建的Actor,Akka也不遑多让。Akka除了最基本的Actor特性外,它可以能在多台机器上透明地实现Actor,此外,还提供了很好的监管特性,这些都是Scala内建的Actor所不具备的。
说了那么多,让我们用一个Hello的例子和Akka打个招呼吧!
<span style="font-family:Microsoft YaHei;">import akka.actor.*; public class Helloworld extends UntypedActor { @Override public void preStart() { final ActorRef greeter = getContext().actorOf(Props.create(Greeter.class), "greeter"); greeter.tell(Greeter.Msg.GREET, getSelf()); } @Override public void onReceive(Object msg) { if (msg == Greeter.Msg.DONE) { System.out.println(this); getContext().stop(getSelf()); } else { unhandled(msg); } } }</span>
这个HelloWorld继承了UntypedActor,表明我们实现的是一个Actor。
其中的preStart是在启动这个Actor时调用的方法。在这里,我们创建了另一个Actor的实例。我们稍后会看到另一个Actor Greeter的实现。然后,我们调用tell方法给它发了一个消息,Greeter.Msg.GREET,后面的getSelf()给出了一个Actor的引用(ActorRef),用以表示发消息的Actor。这只是启动一个Actor,后面的部分才是更重要的。
onReceive方法是处理我们接收到消息的情况。这里我们看到,如果接收到的消息是一个Greeter.Msg.DONE,我们就会停下(stop)所有的处理,同样,getSelf()指明停下的目标,否则的话,就说我们没处理(unhandled)。
看完了一个Actor,或许你已经迫不及待地想看与它打交道的另一个Actor了,下面就是:
<span style="font-family:Microsoft YaHei;">import akka.actor.UntypedActor; public class Greeter extends UntypedActor { public static enum Msg { GREET, DONE } @Override public void onReceive(Object msg) { if (msg == Msg.GREET) { System.out.println("Hello World!"+this); getSender().tell(Msg.DONE, getSelf()); } else { unhandled(msg); } } }</span>
同样的Actor结构,我们已经在HelloWorld类里面看到了。在onReceive方法里,如果它接收到的消息是Msg.GREET,它就打印出“Hello World!”,然后,给发送者回复一条Msg.DONE。没处理的话,就说没处理。
就是这么简单!
好,万事具备,我们把它跑起来。
<span style="font-family:Microsoft YaHei;">import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; public class Demo { public static void main(String[] args) { ActorSystem system = ActorSystem.create("demo1"); ActorRef actor1 = system.actorOf(Props.create(Helloworld.class)); system.shutdown();// } }</span>
相关文章推荐
- android 开发环境
- 顺序表应用(1)
- iOS简单的数据持久化
- bbs用户注册页面源码
- 以cpsw为例学习linux设备树
- Linux 下 profile 技巧
- 各种内部排序方法的比较
- 安卓中的SQLite数据库的基本操作1
- 负数的原码、补码
- 机器学习(1)PLA
- 使 ie8 的 iframe 透明
- Json,List,Map的数据格式详解。
- iOS的沙盒机制
- QT读取文件夹大小
- JSON的解析之net.sf.json
- 深入浅出Mysql(一)
- angular之service、factory预provider区别
- Android服务器与客户端数据交互(Http协议)
- 拖拽UITextView退出键盘
- UNDERSTANDING THE GAUSSIAN DISTRIBUTION