簡體   English   中英

收到7條消息后,Scala郵箱大小為0

[英]Scala mailboxsize is 0 after receiving 7 messages

我是Scala的新手,正在嘗試與actor了解多線程。 我寫了這段代碼,但我不理解某些行為。

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,因為所有消息都是在線程休眠時發送的。 我想我誤會了。 有人可以給我解釋這種行為嗎?

謝謝

未經測試,大多是猜測。 我從沒用過Scala演員

我認為這是一個實施細節。 對我來說,尚不清楚何時執行傳遞給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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM