在阅读了reactScala中的演员使用之后,我认为react在没有多个react待定的情况下会分享相同的线程.似乎并非如此.
import scala.actors.Actor
import scala.actors.Actor._
class SleepyReactor extends Actor {
def act() {
loop {
react {
case x => {
println("reacting to %s on thread %s".format(x, Thread.currentThread.getName))
Thread.sleep(1000)
println("done with " + x)
}
}
}
}
}
val sleepyOne = new SleepyReactor
sleepyOne.start
sleepyOne ! "first" // runs on thread-5
// wait until completion
sleepyOne ! "second" // runs on thread-3
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么这些react是在不同的线程上运行,以及何时为一个演员创建一个新的线程react?
我读到某个地方react是基于事件的,我认为这意味着"反应行动者"共享一个线程,如果一个人"反应",其他"反应行动者"将排队,直到第一个完成.我现在认为我错了.这是如何工作的,它与收到的有何不同?
不要假设每个Actor都有一个单独的线程.Scala机制创建了一个工作线程池,只有在"阻塞"Actors的大小大于池大小时才会增长该池.当你的actor调用时receive,它会处于阻塞状态,直到它收到它的消息.