据我所知Scala Actors
无法被打断。假设我现在有一个超时的任务。如果任务没有在超时内完成,我应该停止它。
假设任务是可中断(例如,在可中断通道上执行阻止i / o)。在Java中,我可以在单独的线程中运行任务,并在超时时中断线程。
我可以使用Scala Actors
执行此操作吗?我应该使用Java线程吗?
答案 0 :(得分:2)
如果您精确地遵循Actor模型,则无法中断Actor。那就是:如果你不想分享。这是在How to cancel an Akka actor答案中通过使用AtomicBoolean来提出的。
然而,一般的答案是:您正在尝试在actor中使用Java线程习语。这是错的。您应该将工作分成更小的批次,而不是长时间运行任务。
来自Akka documentation,演员最佳实践:
演员应该像好伙伴一样:高效地完成工作 没有不必要地打扰其他人,避免占用 资源。转换为编程,这意味着处理事件和 以事件驱动的方式生成响应(或更多请求)。 参与者不应该阻塞(即占用线程时被动等待) 在一些外部实体上 - 可能是一个锁,一个网络套接字, 等 - 除非是不可避免的;在后一种情况下见下文。
你能用Scala Actors做到这一点吗?不,您将遇到同样的问题,因为您的问题具有概念性,与框架实现无关。
您应该使用Java线程吗?如果你想遵循Java线程习语,那么是:去吧。但是如果你想使用Actor并发,你必须采用不同的思维模型来获得所有的好处。