Scala Actor

アクターの生成・開始

extends Actor
import actors.Actor
class MyActor extends Actor {
  def act: Unit = {
    ...
  }
}
val myActor = new MyActor
myActor.start
actorメソッド

ただちに開始する

import actors.Actor._
val myActor = actor {
  ...
}

メッセージ受信

receive

常にスレッドを使用する
receiveの結果を返せる

val myActor = actor {
  val rr = receive {
    case i:Int =>
      println("receive " + i)
      "Int"
  }
  println("receive result " + rr)
}

myActor !  1
react

メッセージ処理中のみスレッドを使用する
reactの結果を返せない

val myActor = actor {
  react {
    case i:Int => println("react " + i)
  }
}

myActor !  1
loop

受信を繰り返す

val myActor = actor {
  loop {
    react {
      case i:Int => println("loop react " + i)
    }
  }
}

myActor !  1
myActor !  2

メッセージ返信

reply
val myActor = actor {
  react {
    case i:Int =>
      println("react " + i)
      reply(i * 2)
  }
}

val result = myActor !?  1
println("actor result " + result)

メッセージ送信

! ($bang)

送信のみ

myActor !  1
!? ($bang$qmark)

送信+返信を待つ

val result = myActor !?  1
println("actor result " + result)
!! ($bang$bang)

送信+返信を待たない
バックグラウンド処理

val myActor = actor {
  react {
    case i:Int =>
      (1 to 1000).toArray
      println("react " + i)
      reply(i * 2)
  }
}

val future = myActor !! 3
println("set " + future.isSet)
(1 to 1000000).toArray
println("set " + future.isSet)
println("actor result " + future())
set false
react 3
set true
actor result 6
!! ($bang$bang) + PartialFunction

future()のあとにPartialFunctionが呼ばれる

val future = myActor !! (3, { case any => println("partial function " + any) })
future()