来自Android Dev Reference:
public abstract boolean cancel (boolean mayInterruptIfRunning)
If the task has already started, then the mayInterruptIfRunning parameter
determines whether the thread executing this task should be interrupted in
an attempt to stop the task.
在谈论只发生一次的任务时,这对我来说很清楚。但不是,当我有一个周期性的任务,我想让它完成当前的“任务”,但不要开始一个新任务。
是不是我可以直接开箱即用?我认为如果我将参数设置为true,它可以在它完成之前停止当前任务,如果我将其更改为false,并且当前正在运行任务,则它什么也不做。这是对的吗?
我如何实现我想要的?我应该以某种方式轮询任务以查找它是否正在运行,并在我发现它不是时取消它?
答案 0 :(得分:0)
不确定您的环境是否详细,但据我所知,您正在使用java.util.concurrent
的某个执行程序来安排定期任务。
cancel()
的基本参数决定是否强制终止正在运行的线程。如果将其设置为false,则只需让程序员通过选中isCanceled()
来确定何时中断正在运行的线程(说明来自Future
和Runnable
的内容)。
因此调用cancel(false)
返回的SheduledFuture
Executor
方法应该对您有用。这不会中断正在运行的任务并阻止它再次运行。调用它之后,Future.get()
将抛出一个异常,这将导致执行者不能在下一个预定的时间运行它。
答案 1 :(得分:0)
使用ScheduledThreadPoolExecutor.shutdown():
... ...
// At some point in the future if you want reject next periodic task submit
// after waiting for current periodic task finish.
scheduledThreadPoolExecutor.shutdown(); // <-- this will reject next periodic task submit.
scheduledThreadPoolExecutor.awaitTermination(10, TimeUnit.SECONDS); // <-- this will wait current periodic task finish.
... ...
必须在shutdown()之后调用awaitTermination(),Android API中没有明确说明,但是,您可以从official Java API找到详细的文档。