2014-02-20 59 views
1

我是新來的Scala,我試圖去理解與演員的多線程。 我寫了這段代碼,我不明白一些行爲。Scala的郵箱大小在收到7封郵件後爲0

package sum 
import scala.actors.Actor._ 

object ActorTest extends App { 

    val caller = self 

    val firstActor = actor { 
    Thread.sleep(3000) 
    println("Messages in mailbox: " + mailboxSize) 
    receive { 
     case x => println("First actor received: " + x) 
    } 
    println("Messages in mailbox: " + mailboxSize) 
    } 

    for(i <- 1 to 7) 
    { 
    firstActor ! "Hello" + i 
    println("Message sent") 
    } 
} 

這是輸出:

Message sent 
Message sent 
Message sent 
Message sent 
Message sent 
Message sent 
Message sent 
Messages in mailbox: 0 
First actor received: Hello1 
Messages in mailbox: 6 

我不明白,爲什麼在第一時間,在信箱中的留言是0,第二次在信箱中的留言是6,因爲所有的消息在線程睡着時發送。 我覺得我誤解了一些東西。有人能給我一個這種行爲的解釋嗎?

感謝

+1

切換到阿卡。舊的斯卡拉演員圖書館已被棄用和劣質。 –

+0

你是什麼意思?這是Scala中的一個bug嗎?它看起來像Akka是另一種語言... – wardva

+0

Akka不是一種語言。它是一個併發和分佈式編程框架,包括可以從Scala或Java使用的Actors的大大改進的實現。它現在(從2.10開始)Scala標準庫期貨的實施。 –

回答

0

未經測試,主要是猜測。我從來沒有使用斯卡拉演員

我認爲這是一個實現細節。對我來說,目前還不清楚什麼時候函數的主體被傳遞給了actor函數。

只要您沒有定義recieve函數,它似乎將郵箱視爲空。 recieve函數是異步執行的,所以我建議你從該函數中檢查郵箱。

val firstActor = actor { 
    receive { 
    case x => 
     println("First actor received: " + x) 
     println("Messages in mailbox: " + mailboxSize) 
    } 

    Thread.sleep(3000) 
    println("Messages in mailbox: " + mailboxSize) 
} 

for(i <- 1 to 7) 
{ 
    firstActor ! "Hello" + i 
    println("Message sent") 
} 

我想,上面的代碼將打印與此類似:

Message sent 
Message sent 
Message sent 
Message sent 
First actor received: Hello2 
Messages in mailbox: 4 
Message sent 
Message sent 
First actor received: Hello1 
Messages in mailbox: 6 
... 
Messages in mailbox: 6 

注意,輸出可能是完全不同的,因爲我不能在什麼樣的順序和以什麼速度演員系統預測處理消息。

至於其他的評論說,當你和演員工作,推薦圖書館Akka

相關問題