回覆可以與方法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
,這是一個容器類,承諾在您需要時給你的內容。它會立即返回,但如果實際請求內容,則必須等到另一個線程完成並填充請求。
- 使用
!?
沒有超時。只要其他線程回覆,您的代碼就會暫停。
- 使用
!?
超時。您的代碼將會暫停,直到獲得答覆或超時過期,以先到者爲準。
下面是三個的例子:
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!
感謝您的!我也做了一些搜索自己,發現這個: http://java.dzone.com/articles/scala-threadless-concurrent 它的日期表明,運營商不是新的2.8,甚至如果CanReply特徵是。 – pdbartlett 2010-05-14 20:10:39
@pdbartlett:沒錯。上面的代碼也可以在2.7中工作,除了'.reverse'不會在2.7中產生一個字符串,所以這個例子不會工作,除非你做'.reverse.toString'。但所有的演員/未來的東西工作得很好。 – 2010-05-14 20:52:21