Ответ 1
Ответы могут быть отправлены с помощью метода reply
, как показано ниже:
import scala.actors._
class Reverser extends Actor {
def act() { Actor.loop { react {
case s: String => Thread.sleep(1000); reply(s.reverse)
case _ => exit()
}}}
}
Существует три способа явного принятия ответа.
- Используйте
!!
, который возвращаетFuture
, который является классом контейнера, который promises, чтобы предоставить вам содержимое, когда вам это нужно. Он возвращается немедленно, но если вы действительно запрашиваете содержимое, вам нужно подождать, пока не будет выполнен другой поток, и заполнит запрос. - Используйте
!?
без таймаута. Ваш код будет приостановлен до тех пор, пока другой ответ будет отвечать. - Используйте
!?
с таймаутом. Ваш код будет приостановлен до получения ответа или до истечения времени ожидания, в зависимости от того, что наступит раньше.
Вот пример всех трех:
val r = new Reverser
r.start
val a = (r !! "Hi")
a() match {
case s: String => println(s)
case _ => println("Error A")
}
val b = r !? "Hello"
b match {
case s: String => println(s)
case _ => println("Error B")
}
val c = (r !? (500,"Howdy"))
c match {
case Some(s: String) => println(s)
case Some(_) => println("Error C")
case None => println("Too slow!")
}
r ! None // None isn't a string, so r will stop running
И если вы запустите это, вы получите
iH
elloH
Too slow!