首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让演员睡觉

让演员睡觉
EN

Stack Overflow用户
提问于 2013-10-30 05:13:28
回答 1查看 627关注 0票数 2

我想让一个演员睡上一段时间,具体来说,它应该决定是否让自己睡,这取决于一种情况:

代码语言:javascript
复制
class MyActor extends Actor {
  def receive {
    case "doWork" => doWork()
  }

  def doWork(): Unit = {
    // doing some work
    val condition = calculateCondition
    if (condition) {
      // sleep for 5 seconds
      // Thread.sleep(5000) 
    }
  }
}

我很确定在演员里面叫Thread.sleep(5000)不是件好事,而且应该有另外一种方法。因此,我如何使它睡觉呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-30 05:59:23

我希望通过改变行为者的状态/行为来实现这一点。Akka为您提供了几种这样做的方法:您可以实现一个完整的状态机,或者使用context.become (并混合在akka.actor.Stash中),并让参与者传递(计划)消息给自己。对于这种情况,前者感觉太过分了,所以下面是我对它进行编码的方式:

代码语言:javascript
复制
import akka.actor._    
import scala.concurrent.duration._

class MySleepyActor(duration: FiniteDuration = (5 seconds)) extends Actor with Stash {

  import context._

  override def preStart() { become(running) }

  def receive = PartialFunction.empty

  def running: Actor.Receive = {
    case "doWork" =>       
      if (doWork()) {
        scheduleReactivate
        become(paused)
      }
    case "wakeUp" => // already awake
  }

  def paused: Actor.Receive = {
    case "doWork" => stash()
    case "wakeUp" => 
      unstashAll()
      become(running)
  }

  def scheduleReactivate: Unit = {
    system.scheduler.scheduleOnce(duration, self, "wakeUp")
  }

  def doWork(): Boolean = {
    // doing some work, then:
    calculateCondition
  }
}

注意:我还没有测试过这个代码!不过,应该给你一些工作上的想法。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19674341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档