2011-11-07 53 views
3

據我所知,Scala管理一個線程池來運行actor,在它們之間共享線程。我可以設置一個特定的演員獨立運行在一個單獨的線程中,絕不會與另一個演員共享它嗎?如何設置一個Scala actor以獨佔使用一個單獨的線程來運行?

+0

我可以問你爲什麼要這樣嗎? –

+0

@ pablo-fernandez安全地使用'java.lang.Thread.sleep(long millis)',而不凍結任何其他可以共享相同線程的actor。實際的任務是在發送刻度消息之間創建一個定時器actor。 – Ivan

+1

如果您需要更好地控制涉及的線程數,我會使用executor框架 –

回答

2

這聽起來像你正在使用斯卡拉(而不是阿卡)演員。在這種情況下,如果你使用receive或​​風格的消息處理,那麼每個actor將獲得自己的線程。使用react消息處理風格共享actor之間的線程池。

當我說receive「風格」,我的意思是在一個循環,例如:

val timerActor = actor { 
    while (true) { 
    receiveWithin(60 * 1000) { 
     case Stop => self.exit() 
     case TIMEOUT => 
      destination ! Tick 
    } 
    } 
} 

在這種情況下timerActor不與任何其他演員分享它的線程。​​將阻止,直到演員收到停止消息或60秒通過。如果經過60秒,則執行TIMEOUT情況。

如果你想了解關於斯卡拉演員的堅韌細節,請查看論文Actors That Unify Threads and Events

除了基於事件的角色之外,Akka還支持基於線程的角色。