Multithreading 如何在Scala中中断任务?

Multithreading 如何在Scala中中断任务?,multithreading,scala,actor,Multithreading,Scala,Actor,据我所知,Scala Actors不能被中断。假设现在我有一个超时的任务。如果任务没有在超时时间内完成,我应该停止它 假设任务是可中断的(例如,对可中断通道执行阻塞i/o)。在Java中,我可以在单独的线程中运行任务,并在超时时中断线程 我可以用Scala Actors?我应该改用Java线程吗?如果严格遵循参与者模型,就不能中断参与者。那就是:如果你不想分享。这是在答案中提出的,例如使用原子布尔 然而,一般的答案是:您试图在actor中使用Java线程习惯用法。这是错误的。您应该将工作分成更小

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

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


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

如果严格遵循参与者模型,就不能中断参与者。那就是:如果你不想分享。这是在答案中提出的,例如使用原子布尔

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

从参与者的角度来看,最佳实践:

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

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


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

Scala Actors从2.11开始就不受欢迎。现在应该转到Akka:没有理由不能在Scala中以完全相同的方式创建线程。看来这是做你想做的事的最好方法。@Felix谢谢。我知道在这种情况下我可以使用线程而不是角色。我想知道这是否被认为是一个好的实践。老实说,我不是Akka的忠实粉丝,因为你会把很多控制权交给框架,以至于你的参与者与其说是参与者,不如说是消息处理器。与Scala actors(不幸的是现在已经不推荐使用)相比,您没有在Akka中定义act方法,相反,您只能定义partialfunction来处理传入消息。为了模仿act方法,你必须做一些奇怪的事情,比如改变演员的行为,使用“Been/unbecome”作为堆栈机器工作。相信我,除非你需要Akka的特定功能,否则就选择线程。。。。但是IO的“效率”往往是你无法控制的。因此,如果一个执行IO的演员——一个非纯演员——可以在IO可以被中断的时候被打断,那就太好了?因为如果您使用的是Java7,就没有理由执行它。Akka已经提供了一些不错的IO构建块。是的。阻止IO。一些第三方库是围绕阻止IO、jdbc、http客户机等构建的……你怎么知道你在干扰正确的参与者?您可以在某些线程上调用Thread.interrupt(),但它也可以在看到中断信号之前处理下一个参与者。@ViktorKlang-恰恰相反:没有人想调用
Thread.interrupt()
。最好是能够调用执行IO的参与者上的某个东西,
中断IO。