endless pulse

どっくんどっくんふるえる毎日を過ごしています

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のクラスが振る舞うようにしないとね!と思ったりしたわけでした。