akka---actor模型

本文转载自: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打个招呼吧!

  • <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>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值