scala高级

-space: normal; widows: 2; word-spacinScala语言入门
注解
能被编译器或外部工具处理的一些信息
Actor和并发
一种便于使用的并发模型,是scala用于大数据处理的结构基础

-webkit-text-stroke-width: 0px; ">注解
为什么使用注解
注解语法
注解举例

variant: normal; font-weight: normal; 为什么使用注解
注解的是在编译和运行之外,对程序进行的操作
自动生成文档
在生成文档时自动排版
代码的错误检查与忽略
注解的实质是一个标签,插入到代码中标志元编程工具对该段代码使用
Java的注解并不影响编译器的运行,但Scala的注解会,如@BeanProperty
可以自行编写新的元编程工具

er-spacing: normal; line-height: norma注解语法
Scala可以为任意的结构代码甚至是参数添加注解
@deprecated def Sum() = { ... } //为方法添加注解
@deprecated class IntStack { ... } //为类添加注解
def check(@NotNull password:String) //为参数添加注解
Scala支持多注解,且注解次序没有影响
@BeanProperty @Id var username = _
部分注解需要引入参数,Scala支持任意类型作为注解参数
@Test( timeout = 100 ) def testA() = { ... }

ng: normal; line-height: normal; orpha注解语法
给主构造器添加注解时,需要将注解放置在构造器之前,并加上一对圆括号
class Credentials @Inject() (var username: String, var password: String)
为表达式添加注解,在表达式后加上冒号,然后是注解
(myMap.get(key): @unchecked) match { ... }
为类型参数添加注解
class MyContainer[@specialized T]
针对实际类型的注解应放置在类型名称之后
String @cps[Unit]

ng: normal; line-height: normal; orpha注解语法
给主构造器添加注解时,需要将注解放置在构造器之前,并加上一对圆括号
class Credentials @Inject() (var username: String, var password: String)
为表达式添加注解,在表达式后加上冒号,然后是注解
(myMap.get(key): @unchecked) match { ... }
为类型参数添加注解
class MyContainer[@specialized T]
针对实际类型的注解应放置在类型名称之后
String @cps[Unit]

2; word-spacing: 0px; -webkit-text-siz注解举例
生成跳转表 @switch
(m : @switch) match {
case 0 => ...
case 1 => ...
case 2 => ... }
基本类型特殊化 @specialized
def sum[@specialized(Int , Double) T] = { ... }

ws: 2; word-spacing: 0px; -webkit-textActor与并发
并发
actor
创建与使用
消息的传递
线程的使用
actor风格
应用实例

pacing: normal; line-height: normal; o并发
什么是并发
将一个计算任务,分成几个小的部份,让它们同时被计算,之后再汇整计算结果
常见的并发结构
多线程,分布式计算,消息传递,资源共享(内存共享)
常用的并发模型
参与者模式
Petri网
通信顺序进程

Actor
参与者模式Actor model
当一个参与者接收到一则讯息,它可以做出一些决策、建立更多的参与者、传送更多
的讯息、决定要如何回答接下来的讯息
Scala使用Actor作为其并发编程模型
一种基于消息传递而非资源共享的并发模型,能尽可能避免死锁和共享状态
actor可以理解为虚拟线程,能实现线程的复用,从而产生数百上千的actor并有效控制
系统开销
Scala在2.10.0版本之后在自带Akka类库作为其Actor推荐实现
Akka是使用Scala编写的实现Actor模型的一个类库
 

normal; widows: 2; word-spacing: 0px; Actor
使用actor需要引入Scala的Actor类库
import scala.actors.Actor
import akka.actor.Actor
继承Actor以使用
class HI extends Actor
object HELLO extends Actor
利用actor方法声明使用
val hi = actor { receive { ... } }
val hello = Array.fill()( actor { react { case _ => } } )

Actor
消息传递是Actor的核心
使用!向actor发送信息
actor使用receive接收信息
msg代表actor当前接收到的信息
对于信息,actor往往使用模式匹配来进行处理,而对于消息的发送者而言,其并不关
心actor接收到信息后如何处理,更不期待actor对该信息有返回,当消息发送后,发送
者便处理下一步
receive方法的参数有各种case语句组成,receive方法获取到消息后依次传递给其参数
,那么,receive方法的case语句需要考虑所有情况吗?

style=" font-style: normal; font-variActor
actor通过react实现线程的复用
receive从线程池获取一个线程并一直使用,react从线程池获取一个线程,使用完释放
def act( ) { react { ... } }
actor(Scala.Actor)的主体为act方法,act方法不能被外部显式调用
actor的act方法在start后启动,act方法本身并不会自动获取线程
在act方法里只能获取一次线程
在以下情况下actor终止执行act方法
act方法返回
act方法由于异常被禁止
actor调用exit方法

spacing: 0px; -webkit-text-size-adjustActor使用原则
避免共享
不调用方法
足够简单
异步调用
使用react
容错




你可能感兴趣的:(scala高级)