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模块支持两种形式:队列和管道,这两种方式都是使用消息传递的 创建队列的类(底层就是以管道和锁定的方式实现 ...
随机推荐
- js 类似于移动端购物车删除,左移动删除
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MYSQL之错误代码----mysql错误代码与JAVA实现
原文地址:MYSQL之错误代码----mysql错误代码与JAVA实现作者:戒定慧 his chapter lists the errors that may appear when you call ...
- Linux运维到底是做什么的?在开始学习之前,你必须了解这些!
首先祝贺你选择学习Linux,你可能即将踏上Linux的工作之旅,出发之前,让我带你来看一看关于Linux和Linux运维的一切. Linux因其高效率.易于裁剪.应用广等优势,成为了当今中高端服务器 ...
- 德尔福 XE5 安卓调试
https://stackoverflow.com/questions/2604727/how-can-i-connect-to-android-with-adb-over-tcp?page=2&am ...
- RNN,LSTM,GRU基本原理的个人理解
记录一下对RNN,LSTM,GRU基本原理(正向过程以及简单的反向过程)的个人理解 RNN Recurrent Neural Networks,循环神经网络 (注意区别于recursive neura ...
- vue 清除keep-Alive页面缓存
- js中sync、defer、async的区别
<script src="script.js"></script> 没有 defer 或 async,浏览器会默认为同步sync,会立即加载并执行指定的脚本 ...
- 排序算法,以php为代码示例
一.冒泡排序 <?php/** * Created by PhpStorm. * User: 郑楚周 * Date: 2018/9/28 * Time: 16:10 */ /**冒泡排序 * C ...
- RNN与情感分类问题实战-加载IMDB数据集
目录 Sentiment Analysis Two approaches Single layer Multi-layers Sentiment Analysis Two approaches Sim ...
- 【转载】什么是Zero-Copy
转载:https://blog.csdn.net/u013256816/article/details/52589524 概述 考虑这样一种常用的情形:你需要将静态内容(类似图片.文件)展示给用户.那 ...