什么时候为Scala actor创建线程的反应?
发布时间:2020-12-16 19:02:27 所属栏目:安全 来源:网络整理
导读:在阅读了 Scala中演员的反应之后,我认为反应将共享相同的线程,因为没有多个反应未决.似乎并非如此. import scala.actors.Actorimport scala.actors.Actor._class SleepyReactor extends Actor { def act() { loop { react { case x = { println("reacting to
在阅读了
Scala中演员的反应之后,我认为反应将共享相同的线程,因为没有多个反应未决.似乎并非如此.
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 有人可以解释为什么这些反应在不同的线程上运行,以及何时为具有反应的actor创建新线程? 我读到某个地方反应是基于事件的,我认为这意味着“反应行动者”共享一个线程,如果一个人“反应”其他“反应行动者”将排队直到第一个完成.我现在认为我错了.这是如何工作的,它与收到的有何不同? 解决方法
确实,对于纯粹的基于事件的actor,其反应代码在与消息发送代码相同的线程上运行.
但是在Scala中,因为当一个actor在其反应代码中调用阻塞操作并统一基于事件和基于线程的actor(能够组合它们)时,阻止一个线程是不可取的,所以这两种类型的actor都使用相同的线程池,但基于线程的actor获取自己的线程,而基于事件的actor根据任务队列共享线程.有关详情,请参阅Philipp Haller和Martin Odersky的Actors that Unify Threads and Events (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |