Akka并发编程——第五节:Actor模型(四)
本节主要内容:
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类的作用原理之后再来讨论
Scala学习(公众微信号:ScalaLearning)每天为大家带来一点Scala语言、Spark、Kafka、Flink、AKKA等大数据技术干货及相关技术资讯。技术永无止境。勇攀高峰,一往直前!
认为文章不错?扫描关注
Akka并发编程——第五节:Actor模型(四)的更多相关文章
- [Java并发编程(五)] Java volatile 的实现原理
[Java并发编程(五)] Java volatile 的实现原理 简介 在多线程并发编程中 synchronized 和 volatile 都扮演着重要的角色,volatile 是轻量级的 sync ...
- 并发编程(五)LockSupport
并发编程(五)LockSupport LockSupport 提供 park() 和 unpark() 方法实现阻塞线程和解除线程阻塞,实现的阻塞和解除阻塞是基于"许可(permit)&qu ...
- Akka并发编程框架 -概念模型(Akka.net或者Orleans)
Akka 来构建具备高容错性.可以横向扩展的分布式网络应用程序. Akka 通常是指一个强大的分布式工具集,用于协调远程计算资源来进行一些工作 Akka 工具集以及Actor 模型的介绍. Actor ...
- 并发编程实践五:ReentrantLock
ReentrantLock是一个可重入的相互排斥锁,实现了接口Lock,和synchronized相比,它们提供了同样的功能.但ReentrantLock使用更灵活.功能更强大,也更复杂.这篇文章将为 ...
- Java并发编程:JMM(Java内存模型)和volatile
1. 并发编程的3个概念 并发编程时,要想并发程序正确地执行,必须要保证原子性.可见性和有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 1.1. 原子性 原子性:即一个或多个操作要么全部 ...
- Java并发编程:JMM (Java内存模型) 以及与volatile关键字详解
目录 计算机系统的一致性 Java内存模型 内存模型的3个重要特征 原子性 可见性 有序性 指令重排序 volatile关键字 保证可见性和防止指令重排 不能保证原子性 计算机系统的一致性 在现代计算 ...
- Java并发编程(五)JVM指令重排
我是不是学了一门假的java...... 引言:在Java中看似顺序的代码在JVM中,可能会出现编译器或者CPU对这些操作指令进行了重新排序:在特定情况下,指令重排将会给我们的程序带来不确定的结果.. ...
- java高并发编程(五)线程池
摘自马士兵java并发编程 一.认识Executor.ExecutorService.Callable.Executors /** * 认识Executor */ package yxxy.c_026 ...
- 5 并发编程-(进程)-队列&生产者消费者模型
1.队列的介绍 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的 创建队列的类(底层就是以管道和锁定的方式实现 ...
随机推荐
- Laravel Mix编译前端资源
目前项目是使用的vue+laravel来写的,其中laravel和vue分别放了一个目录,但是这样有个问题,那就是vue需要经常更新,不然运行项目会经常出现各种问题,这里就看了看laravel的文档, ...
- js 作用域 ?????
///*第一种情况 */ //var mycars = new Array() //mycars[0] = 0; //mycars[1] = 1; //mycars[2] = 2; //functio ...
- python day one
今日内容: python基础: 一 编程语言 什么是编程语言? 上面提及的能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质.在编程的世界里,计算机更像是人 ...
- ansible基础配置
1.基础配置 1.1.环境 主机配置 ansible版本:2.7.4 控制端:centos7.4,IP:192.168.1.213,主机名:operation 被控制端: centos6.5,IP:1 ...
- 雷林鹏分享:PHP 错误处理
在 PHP 中,默认的错误处理很简单.一条错误消息会被发送到浏览器,这条消息带有文件名.行号以及描述错误的消息. PHP 错误处理 在创建脚本和 Web 应用程序时,错误处理是一个重要的部分.如果您的 ...
- 使用layer时控制台出现: Failed to load resource: the server responded with a status of 404 (Not Found)
问题:layer文件路径放置出错 解决:layer文件如图:都放在创建的JS文件里,而不是单独的layer.js文件.
- java IO流 内容整理
在java中,对数据的输入和输出操作以流的方式进行.(注:对文件的操作用io.File类,但不能对文件中的内容进行操作) 一.IO流的分类: 按数据流的方向不同,可以分为输入流和输出流: 按处理数据的 ...
- [Python3网络爬虫开发实战] 1.2.1-Requests的安装
由于Requests属于第三方库,也就是Python默认不会自带这个库,所以需要我们手动安装.下面我们首先看一下它的安装过程. 1. 相关链接 GitHub:https://github.com/re ...
- 第十九节:Scrapy爬虫框架之Middleware文件详解
# -*- coding: utf-8 -*- # 在这里定义蜘蛛中间件的模型# Define here the models for your spider middleware## See doc ...
- 九度oj 题目1205:N阶楼梯上楼问题
题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4990 解决:2039 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用 ...