Scala併發程式設計
在java中,基於共享資料、加鎖的執行緒模型,使得java併發程式設計越來越複雜,而在Scala中採用actor模型,不共享資料,依賴訊息傳遞的併發程式設計模型
原生執行緒、case class訊息傳遞下的偏函式解析
react、loop,基於執行緒重用,讓效能有所提升
點選(此處)摺疊或開啟
-
object Actor_Message extends Actor {
-
def act() {
-
while(true){
-
receive { //收件箱
-
case msg => println("Message content Actor from inbox: " + msg)
-
}
-
}
-
}
-
}
-
object Actor_Messages {
-
-
def main(args: Array[String]) {
-
val actor_Message = actor{ //建立匿名actor,預設啟動
-
while(true){
- receive { //作為偏函式,有apply方法和isDefinedAt方法,apply進行模式匹配。isDefinedAt判斷訊息能否被case處理,若是則返回true。
-
//正常情況下,偏函式會先呼叫isDefinedAt驗證(true還是false),確認apply呼叫時安全的,否則apply模式匹配時會異常
- //而actor做了透明處理,即使沒有匹配的case,不會異常,只會忽略。receive會先呼叫isDefinedAt,如果返回true,才將訊息傳遞給偏函式的apply方法;
-
//最後apply方法處理訊息。如果沒有匹配成功,actor則會處於阻塞狀態。
-
case msg => println("Message content from inbox: " + msg)
-
}
-
}
-
}
-
val double_Message = actor{
-
while(true){
-
receive {
-
case msg : Double => println("Double Number from inbox: " + msg)
-
// case _ => println("Something Unkown" )
-
}
-
}
-
}
-
Actor_Message.start
-
Actor_Message ! "Hadoop" //actor傳送訊息
-
actor_Message ! "Spark"
-
double_Message ! Math.PI
-
double_Message ! "Hadoop"
-
-
}
-
- }
原生執行緒、case class訊息傳遞下的偏函式解析
點選(此處)摺疊或開啟
-
case class Person(name: String, age: Int)
-
-
class HelloActor extends Actor{
-
def act(){
-
while(true){
-
receive { //把收到的訊息傳給偏函式
-
case Person(name, age) => { //線性執行,不存在資源爭用的情況
-
println("Name: " + name + " : " + "Age: " + age)
-
sender ! "Echo!!!" //給傳送訊息的actor回覆訊息。將計算結果以訊息的方式傳遞給其他資料消費者,不要有全域性共享的資料
-
}
-
case _ => println("Something else...") //其他訊息的處理,避免郵箱被佔滿
-
}
-
}
-
}
-
}
-
object Actor_With_CaseClass {
-
-
def main(args: Array[String]) {
-
val hiActor = new HelloActor
-
hiActor.start
-
hiActor ! Person("Spark", 6) //傳送者為main所在的actor
-
-
self.receive{case msg => println(msg)} //self為當前main方法所在actor的引用,這裡接收其他執行緒傳送給主執行緒的訊息
-
// self.receiveWithin(1000){case msg => println(msg)}
-
}
- }
react、loop,基於執行緒重用,讓效能有所提升
點選(此處)摺疊或開啟
-
object NameResolver extends Actor{
-
-
def act(){
-
react { //react處理完訊息後沒有返回
-
case Net (name, actor) =>
-
actor ! getIp(name) //這裡actor就是main傳過來的,即sender
-
act //actor執行緒重複執行,如果不加act方法,執行緒執行完任務後將終止
-
case "EXIT" => println("Name resolver exiting.")
-
case msg =>
-
println("Unhandled message : " + msg)
-
act
- }
-
-
//這兩種方式結果一樣,寫法不同而已
-
loop {
-
react {
-
case Net (name, actor) =>
-
actor ! getIp(name)
-
-
case msg =>
-
println("Unhandled message : " + msg)
-
}
-
}
-
-
}
-
def getIp(name : String) : Option[InetAddress] = {
-
try{
-
println(InetAddress.getByName(name))
-
Some(InetAddress.getByName(name))
-
} catch {
-
case _ : UnknownHostException => None
-
}
-
}
-
}
-
-
case class Net(name : String, actor: Actor)
-
-
object Actor_More_Effective {
-
def main(args: Array[String]) {
-
NameResolver.start
-
NameResolver ! Net("", self) //main所在actor發訊息
-
-
println(self.receiveWithin(1000){case x => x}) //main所在actor收訊息
-
}
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-2051342/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 併發程式設計程式設計
- 【Java併發程式設計】併發程式設計大合集-值得收藏Java程式設計
- Scala 簡介 [摘自 Scala程式設計 ]程式設計
- Go 併發程式設計 - 併發安全(二)Go程式設計
- Golang 併發程式設計Golang程式設計
- 併發程式設計(四)程式設計
- 併發程式設計(二)程式設計
- java 併發程式設計Java程式設計
- 併發程式設計13程式設計
- golang併發程式設計Golang程式設計
- Java併發程式設計Java程式設計
- Go 併發程式設計Go程式設計
- shell併發程式設計程式設計
- 併發程式設計 synchronized程式設計synchronized
- 併發程式設計和並行程式設計程式設計並行行程
- Java併發程式設計-鎖及併發容器Java程式設計
- 併發程式設計之:JUC併發控制工具程式設計
- Java併發系列—併發程式設計挑戰Java程式設計
- 【Java併發程式設計】一、為什麼需要學習併發程式設計?Java程式設計
- Java併發程式設計 - 第十一章 Java併發程式設計實踐Java程式設計
- java-併發程式設計Java程式設計
- 併發程式設計前傳程式設計
- 併發程式設計導論程式設計
- C# 併發程式設計C#程式設計
- Java併發程式設計-CASJava程式設計
- 併發程式設計之:ForkJoin程式設計
- 併發程式設計之:JMM程式設計
- 併發程式設計之:synchronized程式設計synchronized
- 併發程式設計之:Lock程式設計
- 併發程式設計之:CountDownLatch程式設計CountDownLatch
- Java併發程式設計:synchronizedJava程式設計synchronized
- Java 併發程式設計解析Java程式設計
- 併發程式設計進階程式設計
- 併發程式設計概覽程式設計
- Java併發程式設計:LockJava程式設計
- 併發程式設計---JMM模型程式設計模型
- 「聊聊併發程式設計」分享程式設計
- 併發程式設計—— LinkedTransferQueue程式設計