加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

什么时候为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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读