如何在Scala中断任务?

时间:2013-04-10 07:09:10

标签: multithreading scala actor

据我所知Scala Actors 无法被打断。假设我现在有一个超时的任务。如果任务没有在超时内完成,我应该停止它。

假设任务是可中断(例如,在可中断通道上执行阻止i / o)。在Java中,我可以在单独的线程中运行任务,并在超时时中断线程。

我可以使用Scala Actors执行此操作吗?我应该使用Java线程吗?

1 个答案:

答案 0 :(得分:2)

如果您精确地遵循Actor模型,则无法中断Actor。那就是:如果你不想分享。这是在How to cancel an Akka actor答案中通过使用AtomicBoolean来提出的。

然而,一般的答案是:您正在尝试在actor中使用Java线程习语。这是错的。您应该将工作分成更小的批次,而不是长时间运行任务。

来自Akka documentation,演员最佳实践:

  

演员应该像好伙伴一样:高效地完成工作   没有不必要地打扰其他人,避免占用   资源。转换为编程,这意味着处理事件和   以事件驱动的方式生成响应(或更多请求)。   参与者不应该阻塞(即占用线程时被动等待)   在一些外部实体上 - 可能是一个锁,一个网络套接字,   等 - 除非是不可避免的;在后一种情况下见下文。

你能用Scala Actors做到这一点吗?不,您将遇到同样的问题,因为您的问题具有概念性,与框架实现无关。

您应该使用Java线程吗?如果你想遵循Java线程习语,那么是:去吧。但是如果你想使用Actor并发,你必须采用不同的思维模型来获得所有的好处。