Akka并发编程——第五节:Actor模型(四) 停止Actor
来源:互联网 发布:sql语句 修改 编辑:程序博客网 时间:2024/05/18 18:46
本节主要内容:
1. 停止Actor
1. 停止Actor
(1)通过ActorSystem.shutdown方法停止所有 Actor的运行
/**停止Actor:ActorSystem.shutdown方法*/object Example_10 extends App{ import akka.actor.Actor import akka.actor.ActorSystem import akka.actor.Props class FirstActor extends Actor with ActorLogging{ var child:ActorRef = context.actorOf(Props[MyActor], name = "myActor") def receive = { //向MyActor发送消息 case x => child ! x;log.info("received "+x) } override def postStop(): Unit = { log.info("postStop In FirstActor") } } class MyActor extends Actor with ActorLogging{ def receive = { case "test" => log.info("received test"); case _ => log.info("received unknown message"); } override def postStop(): Unit = { log.info("postStop In MyActor") } } val system = ActorSystem("MyActorSystem") val systemLog=system.log //创建FirstActor对象 val firstactor = system.actorOf(Props[FirstActor], name = "firstActor") systemLog.info("准备向firstactor发送消息") //向firstactor发送消息 firstactor!"test" firstactor! 123 //关闭ActorSystem,停止所有Acotr运行 system.shutdown()}
代码运行结果:
[INFO] [04/02/2016 21:51:34.440] [main] [ActorSystem(MyActorSystem)] 准备向firstactor发送消息[INFO] [04/02/2016 21:51:34.441] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor/myActor] received test[INFO] [04/02/2016 21:51:34.441] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor] received test[INFO] [04/02/2016 21:51:34.441] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor] received 123[INFO] [04/02/2016 21:51:34.441] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor/myActor] received unknown message[INFO] [04/02/2016 21:51:34.446] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor/myActor] postStop In MyActor[INFO] [04/02/2016 21:51:34.447] [MyActorSystem-akka.actor.default-dispatcher-5] [akka://MyActorSystem/user/firstActor] postStop In FirstActor
(2)通过context.stop方法停止Actor的运行
/**停止Actor:context.stop方法*/object Example_11 extends App{ import akka.actor.Actor import akka.actor.ActorSystem import akka.actor.Props class FirstActor extends Actor with ActorLogging{ var child:ActorRef = context.actorOf(Props[MyActor], name = "myActor") def receive = { case "stop"=>context.stop(child) case x =>{ //向MyActor发送消息 child ! x log.info("received "+x) } } override def postStop(): Unit = { log.info("postStop In FirstActor") } } class MyActor extends Actor with ActorLogging{ def receive = { case "test" => log.info("received test"); case _ => log.info("received unknown message"); } override def postStop(): Unit = { log.info("postStop In MyActor") } } val system = ActorSystem("MyActorSystem") val systemLog=system.log //创建FirstActor对象 val firstactor = system.actorOf(Props[FirstActor], name = "firstActor") systemLog.info("准备向firstactor发送消息") //向firstactor发送消息 firstactor!"test" firstactor! 123 firstactor!"stop"}
代码运行结果:
[INFO] [04/02/2016 22:02:48.760] [main] [ActorSystem(MyActorSystem)] 准备向firstactor发送消息[INFO] [04/02/2016 22:02:48.761] [MyActorSystem-akka.actor.default-dispatcher-5] [akka://MyActorSystem/user/firstActor/myActor] received test[INFO] [04/02/2016 22:02:48.761] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor] received test[INFO] [04/02/2016 22:02:48.762] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor] received 123[INFO] [04/02/2016 22:02:48.762] [MyActorSystem-akka.actor.default-dispatcher-5] [akka://MyActorSystem/user/firstActor/myActor] received unknown message[INFO] [04/02/2016 22:02:48.763] [MyActorSystem-akka.actor.default-dispatcher-5] [akka://MyActorSystem/user/firstActor/myActor] postStop In MyActor
代码的重点为
class FirstActor extends Actor with ActorLogging{ var child:ActorRef = context.actorOf(Props[MyActor], name = "myActor") def receive = { case "stop"=>context.stop(child) case x =>{ //向MyActor发送消息 child ! x log.info("received "+x) } } override def postStop(): Unit = { log.info("postStop In FirstActor") } }
中的case “stop”=>context.stop(child),直接通过context.stop方法停止Actor的运行。注意程序中并没有使用system.shutdown方法,因此整个程序的不会停止,如下图所示
(3)通过akka.actor.PoisonPill消息停止Actor的运行
/**停止Actor:使用akka.actor.PoisonPill*/object Example_12 extends App{ import akka.actor.Actor import akka.actor.ActorSystem import akka.actor.Props import akka.actor.PoisonPill class FirstActor extends Actor with ActorLogging{ var child:ActorRef = context.actorOf(Props[MyActor], name = "myActor") def receive = { //向child发送PoisonPill停止其运行 case "stop"=>child!PoisonPill case x =>{ //向MyActor发送消息 child ! x log.info("received "+x) } } override def postStop(): Unit = { log.info("postStop In FirstActor") } } class MyActor extends Actor with ActorLogging{ def receive = { case "test" => log.info("received test"); case _ => log.info("received unknown message"); } override def postStop(): Unit = { log.info("postStop In MyActor") } } val system = ActorSystem("MyActorSystem") val systemLog=system.log //创建FirstActor对象 val firstactor = system.actorOf(Props[FirstActor], name = "firstActor") systemLog.info("准备向firstactor发送消息") //向firstactor发送消息 firstactor!"test" firstactor! 123 firstactor!"stop"}
代码运行结果:
[INFO] [04/02/2016 22:12:09.947] [main] [ActorSystem(MyActorSystem)] 准备向firstactor发送消息[INFO] [04/02/2016 22:12:09.947] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor/myActor] received test[INFO] [04/02/2016 22:12:09.947] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor] received test[INFO] [04/02/2016 22:12:09.947] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor] received 123[INFO] [04/02/2016 22:12:09.947] [MyActorSystem-akka.actor.default-dispatcher-2] [akka://MyActorSystem/user/firstActor/myActor] received unknown message[INFO] [04/02/2016 22:12:09.951] [MyActorSystem-akka.actor.default-dispatcher-4] [akka://MyActorSystem/user/firstActor/myActor] postStop In MyActor
代码与Exampel_11中的不同之处在于
//向child发送PoisonPill停止其运行case "stop"=>child!PoisonPill
它使用不是context.stop方法,而是向MyActor发送了PoisonPill消息,其它代码不变。
还有一种gracefulStop方法可以停止Actor的运行,这部分内容等了解完Future类的作用原理之后再来讨论
阅读全文
0 0
- Akka并发编程——第五节:Actor模型(四) 停止Actor
- Akka并发编程——第五节:Actor模型(四)
- Akka并发编程——4、Actor模型(四)
- Akka并发编程——1、Actor模型(一)
- Akka并发编程——2、Actor模型(二)
- Akka并发编程——3、Actor模型(三)
- Akka并发编程——5、Actor模型(五)
- Akka并发编程——第三节:Actor模型(二)
- Akka并发编程——第八节:Actor模型(七)
- Akka并发编程——第三节:Actor模型(二)
- Akka并发编程——第八节:Actor模型(七)
- Actor编程模型——akka
- Akka并发编程——第二节:Actor模型(一)
- Akka并发编程——第四节:Actor模型(三)
- Akka并发编程——第六节:Actor模型(五)
- Akka并发编程——第七节:Actor模型(六)
- Akka并发编程——第二节:Actor模型(一)
- Akka并发编程——第四节:Actor模型(三)
- 算法设计与分析复习(一):习题解答
- [LeetCode] Max Points on a Line
- 详解线上线下收单业务(1)
- 尺取法
- Linux基本操作及数据库查询
- Akka并发编程——第五节:Actor模型(四) 停止Actor
- 4-10固定定位
- linux系统644、755、777权限详解
- Java常识求阶层!的和 ,获取某个数组中的最小值,定义数组,获得成绩之和,平均成绩,最小成绩,最大成绩。等问题大全
- Revit二次开发——revit怎么给桥梁加钢筋
- rescue(BFS+优先队列)
- Linux常用功能
- 进程间通信(一)-----管道
- 高等数学图形与动画