Actorのスレッド
ちょっと作ってたらActorのスレッドについて面白いことがわかったのでメモ。例によって、、当たり前のことかもしれません。。
Actorは新しいスレッドを作る?
てっきり私はScalaのActorは新しいスレッドを作るのかと思ってました。Actorについて…は、また機会があったら書くこともあるかも知れませんが、ググるといっぱいでてきますのでそちらを参考に…!
要するに、Actor1つにつき1つのスレッドが立って、メッセージのやりとりで並行プログラミングを行う!っていう感じ…ですかね…(ものすごく語弊がある気がするので突っ込みあればいくらでもどうぞ)
けど、こんなサンプルプログラムを走らせたら面白いことに。
import scala.actors.Actor import scala.actors.Actor._ class Samle extends Actor { def threadPrint = { var t = Thread.currentThread() println("Actor id = " + t.getId() + ", name = " + t.getName()) // スレッドIDと名前を表示 } threadPrint def act() = { threadPrint val sub = new SubSample() } } class SubSample { def threadPrint = { var t = Thread.currentThread() println("Sub id = " + t.getId() + ", name = " + t.getName()) // スレッドIDと名前を表示 } threadPrint } object Main { val sample = new Sample() def main (args : Array[String]) { sample.start var t = Thread.currentThread() println("Main id = " + t.getId() + ", name = " + t.getName()) // スレッドIDと名前を表示 Thread.sleep(1000) } }
実行結果
Actor id = 1, name = main Main id = 1, name = main Actor id = 10, name = ForkJoinPool-1-worker-0 Sub id = 10, name = ForkJoinPool-1-worker-0
ScalaのActorはactメソッドの中で新しいスレッドを作る
…ということですよね?←
…こともある、そうです。。
コメントにより、必ず新しいスレッドが作られるわけではないとのご指摘を受けたのでもうちょっと勉強します><
まあせっかくActorのクラスなのに何のメッセージのやりとりもない、ひどいサンプルでごめんなさい。なので想定したActorの振る舞いをちゃんと欲しいのであれば、actメソッドの中を必ず通してActorのクラスが振る舞うようにしないとね!と思ったりしたわけでした。