从Kestrel看Scala的核心程序模块
创始人
2024-06-07 16:21:33
0

之前曾介绍过Kestrel这个Scala实例教程,这个代码实例在Twitter中也有用到,相当于Ruby中的Starling。有关Kestrel还有很多其他的细节,下面继续介绍Scala的核心程序模块,Scala的开发包以及Scala Actor。

读完ManyClients.scala之后,基本上对Scala有一个大致的印象了,接着我们就开始读Scala的核心程序模块,从src/main/scala/net/kestrel开始。

需要介绍一些scala的package:

  1. ……  
  2. import java.util.concurrent._  
  3. import scala.actors.{Actor, Scheduler}  
  4. import scala.actors.Actor._  
  5. import scala.collection.mutable  
  6. import org.apache.mina.core.session.IoSession  
  7. ……  

#t#在Scala里面主要用到了几个开发包,java.util.concurrent是Java 5.0平台上的多线程框架。org.apache.mina是Apache Mina提供的NIO开发包,因为走读主要是为了了解Scala,所以就不多说这两个包了,让我们着重说一下scala的一个非常有用的多线程核心包actor。

actor,在Scala中几乎占到了非常核心的地位(可以说就是Scala的核心)。有很多人几乎是同时听到actor和scala的。或者是因为scala有了actor,才决定用scala的。当然,scala不仅仅有actor,在后面的代码中,你可以看到许多语言的设计,都使得actor的设计近乎***,简洁的,可读性很高的代码,可以完成非常多的工作。

不过还是让我们从简单的actor开始吧,一个完整的actor写法如下:

  1. import scala.actors.Actor  
  2. class Redford extends Actor {  
  3.   def act() {  
  4.     println("A lot of what acting is, is paying attention.")  
  5.   }  
  6. }  
  7. val robert = new Redford  
  8. robert.start  

Redford继承一个Actor的类(关于class和object在Scala的区别,我们稍后再说),它有一个函数,也就是线程运行的内容叫做act(),当线程启动之后,就会执行这个act()函数。需要调用这个线程的时候,创建这个对象,然后调用robert.start线程就启动了。

这个写法其实没有太多的精细,只是比Java的写法少敲了一些键盘而已。这倒是没有什么错,但是往下看,我们多import进来一个package,就可以这样写了:

  1. import scala.actors.Actor  
  2. import scala.actors.Actor._  
  3. val paulNewman = actor {  
  4.   println("To be an actor, you have to be a child.")  
  5. }  

直接启动一个线程,处理一个分支的业务。大括号里面的就是act()的函数体。再回过来看Kestrel的代码:

  1. private val deathSwitch = new CountDownLatch(1)  
  2. ……  
  3. def startup(config: Config): Unit = {  
  4.     ……  
  5.     // make sure there's always one actor running so scala 2.7.2  
  6.     // doesn't kill off the actors library.  
  7.     actor {  
  8.       deathSwitch.await  
  9.     }  
  10.     ……  
  11. }  
  12. def shutdown(): Unit = {  
  13.     ……  
  14.     deathSwitch.countDown  
  15. }  

注意那句注释,在startup系统中多开一个线程,让服务可以一直运行着……直到shutdown。

回过来我们说一下class和object的区别:

1. 对于Scala的编译器来看,class不支持任何的static变量,在使用class的时候,必须要先用new来创建实例。而object可以看做是一个只有static内容的Java类,所以对它的调用不需要创建,直接调用即可。

2. 在设计模式里面,object可以看做是一个Singleton,也就是单例模式。所以在调用的时候,就不需要象Java一样,老是要getInstance来获取句柄了。

当我们看到PersistentQueue.scala的时候,一个文件中同时包含了class PersistentQueue和object PersistentQueue。就比较容易了解class和object的用法了。

【编辑推荐】

  1. 走读Kestrel,了解Scala
  2. Scala实例教程:Kestrel
  3. 从Scala看canEqual与正确的的equals实现
  4. Java:所有的equals方法实现都是错误的?
  5. Scala编程语言

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...