何时为Scala actor创建的线程会做出反应?

agi*_*all 8 scala

在阅读了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是基于事件的,我认为这意味着"反应行动者"共享一个线程,如果一个人"反应",其他"反应行动者"将排队,直到第一个完成.我现在认为我错了.这是如何工作的,它与收到的有何不同?

Wal*_*ang 9

确实,对于纯粹的基于事件的actor,其反应代码在与消息发送代码相同的线程上运行.

但是在Scala中,因为当actor在其反应代码中调用阻塞操作并统一基于事件和基于线程的actor(能够组合它们)时阻止线程是不可取的,所以这两种类型的actor都使用相同的线程池,但基于线程的actor获取自己的线程,而基于事件的actor根据任务队列共享线程.有关详细信息,请参阅Philipp Haller和Martin Odersky 统一线程和事件演员


and*_*nka 5

不要假设每个Actor都有一个单独的线程.Scala机制创建了一个工作线程池,只有在"阻塞"Actors的大小大于池大小时才会增长该池.当你的actor调用时receive,它会处于阻塞状态,直到它收到它的消息.