[英]Java: Timer and thread it creates
我有这个问题:
我有一个计时器。 使用scheduleAtFixedRate,它会创建一个新的Timer任务。 在该计时器任务中有某些代码,可能需要一段时间才能完成。 如何在前一个任务尚未完成时确保Timer不会创建新任务?
谢谢
我的答案是不使用Timer
,它已经过时了。 自Java5以来, Timer
已被ScheduledExecutorService
取代,后者更灵活,更易于使用。 您可以更好地控制调度程序的工作方式,即Timer
无法实现的控制。
您可以使用Executors工厂类创建一个工厂类,该工厂类具有许多工厂方法。 您应该关注的是newSingleThreadScheduledExecutor ,它应该完全符合您的要求:
创建一个单线程执行程序,可以调度命令在给定的延迟后运行,或者定期执行。 保证任务按顺序执行,并且在任何给定时间不会有多个任务处于活动状态。
使用ScheduledExecutorService
,而不是子类化TimerTask
,直接将Runnable
子类化,然后将任务提交给执行程序。 执行程序有各种方法,你需要选择哪一种方法适合你的需要(仔细阅读ScheduledExecutorService
的javadoc),但要点是这样的:
// initialise the executor
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
while (tasksRemaining) {
// create your task
Runnable task = ....;
// submit it to the executor, using one of the various scheduleXYZ methods
executor.schedule(task, delay, unit);
}
// when everything is finished, shutdown the executor
executor.shutdown();
像往常一样,阅读javadoc。
Timer类的doc
对应于每个Timer对象的是一个后台线程,用于按顺序执行所有计时器的任务。 计时器任务应该快速完成。 如果计时器任务花费过多时间来完成,它会“占用”计时器的任务执行线程。 反过来,这可以延迟后续任务的执行,后续任务可以在紧急任务最终完成时(以及如果)快速连续地“聚集”并执行。
表明只有一个后台主题。 所以我相信这种情况不会发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.