1. 程式人生 > >【圖文詳細 】Scala——Actor

【圖文詳細 】Scala——Actor

3、Scala Actor 

 

3.1、概念 
Scala 中的 Actor 能夠實現並行程式設計的強大功能,它是基於事件模型的併發機制,Scala 是運 用訊息(message)的傳送、接收來實現多執行緒的。使用 Scala 能夠更容易地實現多執行緒應 用的開發。 
 
一個 Actor 是一個容器,它包含狀態,行為,信箱,子 Actor 和監管策略,所有這些包含在 一個 ActorReference(Actor 引用)裡。一個 Actor 需要與外界隔離才能從 Actor 模型中獲益, 所以 Actor 是以 Actor 引用的形式展現給外界的。

 

3.2、傳統的 Java 併發程式設計模型和 Scala Actor 區別 

3.2.1、Java 中的併發程式設計模型 
1、Java 中的併發程式設計基本上滿足了事件之間相互獨立,但是事件能夠同時發生的場景的需 要。 
2、Java 中的併發程式設計是基於共享資料和加鎖的一種機制,即會有一個共享的資料,然後有 若干個執行緒去訪問這個共享的資料(主要是對這個共享的資料進行修改),同時 Java 利用加鎖 的機制(即 synchronized)來確保同一時間只有一個執行緒對我們的共享資料進行訪問,進而保 證共享資料的一致性。 
3、Java 中的併發程式設計存在資源爭奪和死鎖等多種問題,因此程式越大問題越麻煩。 

3.2.2、Scala 中的併發程式設計模型 
1、Scala 中的併發程式設計思想與 Java 中的併發程式設計思想完全不一樣,Scala 中的 Actor 是一種不 共享資料,依賴於訊息傳遞的一種併發程式設計模式,避免了死鎖、資源爭奪等情況。在具體實 現的過程中,Scala 中的 Actor 會不斷的迴圈自己的郵箱,並通過 receive 偏函式進行訊息的 模式匹配並進行相應的處理。 
2、如果 Actor A 和 Actor B 要相互溝通的話,首先 A 要給 B 傳遞一個訊息,B 會有一個收件 箱,然後 B 會不斷的迴圈自己的收件箱,若看見 A 發過來的訊息,B 就會解析 A 的訊息並執 行,處理完之後就有可能將處理的結果通過郵件的方式傳送給 A。

 

3.2.3、Java 和 Scala 的程式設計模型對比 

 

對於 Java,我們都知道它的多執行緒實現需要對共享資源(變數、物件等)使用 synchronized 關鍵字進行程式碼塊同步、物件鎖互斥等等。而且,常常一大塊的 try…catch 語句塊中加上 wait 方法、notify 方法、notifyAll 方法是讓人很頭疼的。原因就在於 Java 中多數使用的是可 變狀態的物件資源,對這些資源進行共享來實現多執行緒程式設計的話,控制好資源競爭與防止對 象狀態被意外修改是非常重要的,而物件狀態的不變性也是較難以保證的。而在 Scala 中, 我們可以通過複製不可變狀態的資源(即物件,Scala 中一切都是物件,連函式、方法也是) 的一個副本,再基於 Actor 的訊息傳送、接收機制進行並行程式設計 

 

3.3、Actor 傳送訊息的方式 

 

3.4、Scala Actor 例項 

package com.mazh.scala.actor 
//注意導包是 scala.actors.Actor 
import scala.actors.Actor 
 
object MyActor1 extends Actor{ 
  // 重新 act 方法 
  def act(){ 
    for(i <- 1 to 10){ 
      println ("actor-1 " + i) 
Thread. sleep (2000) 
    } 
  } 
} 
 
object MyActor2 extends Actor{ 
  // 重新 act 方法 
  def act(){ 
    for(i <- 1 to 10){ 
      println ("actor-2 " + i) 
      Thread. sleep (2000) 
    } 
  } 
} 
 
object ActorTest extends App{ 
  // 啟動 Actor 
  MyActor1.start() 
  MyActor2.start() 
}

說明:上面分別呼叫了兩個單例物件的 start()方法,他們的 act()方法會被執行,相同與在 Java 中開啟了兩個執行緒,執行緒的 run()方法會被執行 
 
注意:這兩個 Actor 是並行執行的,act()方法中的 for 迴圈執行完成後 actor 程式就退出了