如何停止在java.util.Timer类中预定的任务

110

我正在使用java.util.Timer类,我正在使用它的schedule方法执行一些任务,但在执行6次后,我必须停止它的任务。

我该怎么做?


更新:如其Javadoc所述,TimerTimerTask类已被取代。学习使用Java 5+中添加的Executors框架。请参阅Oracle的Java教程 - Basil Bourque
4个回答

156

在某个地方保留计时器的引用,并使用:

timer.cancel();
timer.purge();

为了停止正在进行的操作,你可以将此代码放置在正在执行的任务中,并使用 static int 计算循环次数,例如:

private static int count = 0;
public static void run() {
     count++;
     if (count >= 6) {
         timer.cancel();
         timer.purge();
         return;
     }

     ... perform task here ....

}

12
我认为“取消”已足够,不需要进行“清除”。 - LiangWang
1
根据《Effective Java》一书,将timer.cancel()添加到final中是否好? - Tushar Pandey
1
@Jacky,同时拥有两者是一个好的实践,但从理论上讲,“cancel”本身就可以工作。 - Fritz H
12
@Jacky是正确的,看看Timer的实现。在取消后调用purge绝对没有用。cancel清除整个任务列表,而purge遍历同一个列表,检查状态是否为CANCELED,然后删除任务。 - Boyan
1
在 Timer 上调用 cancel() 将取消该计时器上执行的所有任务。这是一个不好的想法,因为通常一个 Timer 实例会用于多个定时任务。使用单个 Timer 是很重要的,因为 Timer 很昂贵:它分配了一个线程。正确的做法是保留对 Timer*Task 的引用,并在其上调用 cancel(),因为这将终止该实例并保留其他实例不变。 - fjalvingh
2
如果启动计时器的活动/片段被销毁或停止,计时器预定会自行停止吗? - aLL

65

如果定时器只执行这一项任务,可以调用 Timercancel() 方法; 如果定时器还有其他需要继续执行的任务,则应该调用 TimerTaskcancel() 方法。


39

您应该停止定时器上已安排的任务: 您的定时器:

Timer t = new Timer();
TimerTask tt = new TimerTask() {
    @Override
    public void run() {
        //do something
    };
};
t.schedule(tt,1000,1000);

为了停止:
tt.cancel();
t.cancel(); //In order to gracefully terminate the timer thread

请注意,仅取消计时器不会终止正在进行的计时任务。

我有两种方法。从不同的方法中停止TimerTask是否可行? - Sachin HR

2

在特定的毫秒时间后唤醒后,终止计时器。

Timer t = new Timer();
t.schedule(new TimerTask() {
            @Override
             public void run() {
             System.out.println(" Run spcific task at given time.");
             t.cancel();
             }
 }, 10000);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接