我讀過,使用反應時,所有演員都可以在單個線程中執行。我經常並行處理一個集合,並需要輸出結果。我不相信System.out.println是線程安全的,所以我需要一些保護。一種方法(傳統方式),我可以這樣做:使用斯卡拉演員的麻煩
val lock = new Object
def printer(msg: Any) {
lock.synchronized {
println(msg)
}
}
(1 until 1000).par.foreach { i =>
printer(i)
}
println("done.")
這是如何第一個解決方案比較,在效率方面使用的演員?是不是真的,我沒有創建一個新的線程?
val printer = actor {
loop {
react {
case msg => println(msg)
}
}
}
(1 until 10000).par.foreach { i =>
printer ! i
}
println("done.")
但是,它似乎不是一個好的選擇,因爲演員代碼永遠不會完成。如果我在底部放置println,它將永遠不會被擊中,即使它看起來像是經歷了每次迭代i
。我究竟做錯了什麼?
有時,即使執行完成,Scala終端也會變得有趣並且「掛起」。不完全確定原因,但在輸出所有值後必須按Enter鍵。 –
我希望最終會顯示一個'println(「done。」)「,但它不是('2.9.1.r0-b20110831114755')。 – schmmd
就好像在打印大部分數字之前「正在完成」一樣。嘗試從(1到10)運行,你應該得到相同的結果。至於這種行爲的原因,演員是異步的。消息被髮送,循環退出,並且在演員處理所有消息之前,程序的其餘部分結束。 –