这是我第一次在这里提问,而且我对scala相对较新。 我有以下代码:
implicit val context = ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor())
val system = ActorSystem("My System")
val update = future {
def doSomething(args...) = {
// Do Stuff
}
val result = system.scheduler.schedule(Duration.create(delay, TimeUnit.MILLISECONDS),
Duration.create(interval, TimeUnit.MILLISECONDS))(doSomething(args...))
}
我需要多次执行doSomething函数,上面的代码符合我的需要,但在某些情况下我需要停止它。
所以我的问题是什么是停止调度程序的最佳方法? 提前谢谢。
答案 0 :(得分:4)
为什么在Future中有调度程序?我相信您可以使用Java Timer任务执行相同操作而无需创建ActorSystem。我的意思是当你不使用Actors的核心功能时,我不明白为什么你想使用Actors来调用Future。也许我错过了什么。
这是一种做法。您可以向取消调度程序的actor发送消息cancelSomethingMsg。调度程序本身以预定的频率向自己发送消息。
object MyActor {
case object doSomethingMsg
case object cancelSomethingMsg
}
class MyActor extends Actor {
private var cancellable: Option[Cancellable] = None
override def preStart() = {
//schedule a message doSomethingMsg to self every 5 seconds
cancellable = Option(context.system.scheduler.schedule(5 seconds, duration, self, doSomethingMsg))
}
override def postStop() = {
cancellable.foreach(_.cancel())
cancellable = None
}
def doSomethingF = { future {//make sure you don't close over mutable state of the actor inside this Future} }
def receive = {
case doSomethingMsg => doSomethingF()
case doCancelMsg => cancellable.foreach(_.cancel())
}
}
答案 1 :(得分:2)
您的结果val
属于Cancellable
类型,您可以取消它。但我相信它会在执行之间取消,而不是在执行doSomething
方法