【问题标题】:How to set up a Scala actor to exclusively use a separate thread to run?如何设置 Scala Actor 以独占使用单独的线程运行?
【发布时间】:2011-12-24 01:16:19
【问题描述】:

据我了解,Scala 管理一个线程池来运行actors,在它们之间共享线程。我可以设置一个特定的 Actor 以独占方式在单独的线程中运行,而不与其他 Actor 共享它吗?

【问题讨论】:

  • @pablo-fernandez 安全地使用java.lang.Thread.sleep(long millis),而不会冻结任何其他可以共享同一线程的参与者。实际任务是创建一个在发送滴答消息之间休眠的计时器actor。
  • 如果您需要更好地控制所涉及的线程数,我会使用执行器框架

标签: multithreading scala actor


【解决方案1】:

听起来您正在使用 Scala(不是 Akka)actors。在这种情况下,如果您使用receivereceiveWithin 样式的消息处理,那么每个参与者都将获得自己的线程。使用react 样式的消息处理在参与者之间共享一个线程池。

当我说receive“风格”时,我的意思是在一个循环中,例如:

val timerActor = actor { 
  while (true) {
    receiveWithin(60 * 1000) {
       case Stop => self.exit()
       case TIMEOUT =>
          destination ! Tick
    }
  }
}

在这种情况下,timerActor 不与任何其他参与者共享其线程。 receiveWithin 将一直阻塞,直到参与者收到停止消息或 60 秒过去。如果 60 秒过去了,则执行 TIMEOUT 案例。

如果您想了解有关 Scala 演员的详细信息,请查看论文 Actors That Unify Threads and Events

除了基于事件的actors之外,Akka 还支持基于线程的actors。

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    相关资源
    最近更新 更多