Scala Actor 阻塞当前线程

标签 scala concurrency actor

我尝试基于 Scala 的 actor API 实现一个计时器,其中当前的 Thread actor (Actor.self) 作为计时器和一个匿名 Actor 来完成需要及时完成的​​工作。
我有以下 Scala 程序

import scala.actors.Actor.self
import scala.actors.TIMEOUT

object Main {
  def main(args: Array[String]): Unit = {
    val thiz = self
    actor {
      // do heavy work here
      thiz ! "finish"
    }
    self.reactWithin(1000) { 
      case "finish" => println("complete")
      case TIMEOUT  => println("timeout")
    }
  }
}

当我运行程序时,我收到了
Exception in thread "main" scala.actors.SuspendActorControl
scala.actors.ActorProxy@1d99a4d: caught java.lang.InterruptedException

请告诉我解决问题的方法。

最佳答案

您有两种类型的控制传递与 scala-actor,线程阻塞 线程悬挂 .后者意味着抛出一个控制异常(线程再次可供线程池管理器使用),并且当消息进入其邮箱时重新执行actor主体。见 actors tutorial有关更多详细信息,尤其是部分“让它无线程!”。
receiveWithin方法使用线程阻塞,而reactWithin暂停。您在这里遇到的问题是没有捕获异常的外部管理参与者。这仅适用于“适当的”actor,不适用于为主线程创建的代理。所以如果你想在显式actor外等待主线程,你需要使用线程阻塞/receiveWithin :

self.receiveWithin(1000) { ... }

关于Scala Actor 阻塞当前线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11677584/

相关文章:

scala - 带有 IntelliJ 和 SBT 的自定义文件夹结构的 Uber jar

java - 从并发修改的 ConcurrentSkipListSet 创建 TreeSet 的异常

concurrency - 连接语言和并发——原则上有困难吗?

scala - 喷洒死信消息

java - Spark 提交 : --packages vs --jars

scala - 何时使用案例类或常规类

scala - SBT 未能解决依赖关系

concurrency - 为什么我的并发函数在 Go 中过早退出?

swift - 从 actor 的 init 方法中调用方法

exception - Service Fabric Actor 远程调用导致 "Specified cast is not valid."异常