我想澄清一些关于 TimerTask 的事情。当你有下面的代码时:
timer.schedule(task, 60000);
如果任务计划在接下来的 1 分钟内运行,则任务对象是否已经在执行?
因为在我的代码中的某个地方我调用了 task.cancel() 但似乎该调用并没有阻止
要执行的任务。我什至记录了调用的返回值,它返回 false。
当我阅读取消方法的文档时,我提出了我的问题:
取消 TimerTask 并将其从 Timer 队列中删除。
通常,如果调用没有阻止 TimerTask,则返回 false
至少运行一次。后续调用没有任何效果。如果调用阻止了计划执行的发生,则返回 true,否则返回 false。
我相信我在 1 分钟延迟之前调用了 cancel() 。但为什么cancel返回false,
[任务] 已经在执行了吗?
希望您能给我线索/提示,甚至对此进行解释。谢谢!
- 任务计划在接下来的 1 分钟内运行,任务对象是否已经在执行
不,它将调用run http://download.oracle.com/javase/6/docs/api/java/util/TimerTask.html#run%28%29方法在 60 秒内完成此任务。如果task.cancel()
回报false
,这可能意味着三件事:
- 该任务被安排为一次性执行并且已经运行或
- 该任务从未被安排或
- 任务已取消或
因此,如果您确定您致电cancel
在安排任务后 60 秒之前,您可能会多次调用它,并从后续任务中获取结果cancel
,或者您正在对其他任务调用取消。
一般来说,我会建议反对Timer http://download.oracle.com/javase/6/docs/api/java/util/Timer.html赞成预定执行服务 http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html
您可以通过以下方式实现所需的功能:
ScheduledExecutorService.schedule(可调用,延迟,时间单位) http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#schedule%28java.util.concurrent.Callable,%20long,%20java.util.concurrent.TimeUnit%29
概述了 ScheduledExecutorService 成为首选方式的原因here https://stackoverflow.com/questions/409932/java-timer-vs-executorservice/409993#409993:
-
Timer 可能对系统时钟的变化敏感,而 ScheduledThreadPoolExecutor 则不然
-
Timer只有一个执行线程,因此长时间运行的任务会延迟其他任务。 ScheduledThreadPoolExecutor 可以配置任意数量的线程。此外,如果您愿意,您可以完全控制创建的线程(通过提供 ThreadFactory)
-
TimerTask 中抛出的运行时异常会杀死该线程,从而使 Timer 死亡:-( ...即计划任务将不再运行。ScheduledThreadExecutor 不仅捕获运行时异常,而且可以让您根据需要处理它们(通过覆盖来自的 afterExecute 方法) ThreadPoolExecutor). 抛出异常的任务将被取消,但其他任务将继续运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)