5

据我了解Scala Actors ,不能被打断。现在假设我有一个超时任务。如果任务没有在超时时间内完成,我应该停止它。

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

我可以这样做Scala Actors吗?我应该改用 Java 线程吗?

4

1 回答 1

2

如果您精确地遵循 Actor 模型,您将无法打断 Actor。那就是:如果你不想分享。例如,如何通过使用 AtomicBoolean 取消 Akka 演员答案中提出了这一点。

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

来自Akka 文档,Actor Best Practices:

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

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

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

于 2013-04-11T12:22:13.820 回答