如何提前取消timer.schedule()调用

时间:2013-09-22 07:30:59

标签: java time timer

我已经安排了一种方法,以便在将来某个日期运行;但是,某些事件可能会或可能不会在该日期之前发生,这意味着我希望在指定日期之前运行该方法;我怎样才能做到这一点?我目前有:

Timer timer = new Timer();
TimerTask task = new TaskToRunOnExpriation();
timer.schedule(task, myCalendarObject.getTime());

我会在我的应用程序中运行许多这些TimerTask,如果某种情况发生,请停止它们的特定实例?

修改 我只想取消给定事件的单Timer,是否有办法管理Timers的身份,以便我可以轻松找到并停止它?

4 个答案:

答案 0 :(得分:2)

如果你有成千上万的,你应该使用一个ScheduledExecutorService来汇集线程,而不是一个Timer,每个定时器会使用一个线程。

执行程序服务在计划任务时返回的ScheduledFutures也有取消方法来取消基础任务:future.cancel(true);

至于取消正确的任务,您可以将期货存储在Map<String, Future>中,以便您可以按名称或ID访问它们。

答案 1 :(得分:0)

在C#中我会说使用委托,但这不是Java中的一个选项。我会解决这个问题:

class Timers
{
    Timer timer1;
    Timer timer2;
    ArrayList<Timer> timerList;

    public Timers()
    {
        // schedule the timers
    }

    // cancel timers related to an event
    public void eventA()
    {
        timer1.cancel();
        timer2.cancel();
    }

    public void eventB()
    {
        for(Timer t : timerList)
            t.cancel();
    }
}

答案 2 :(得分:0)

使用此计划方法。

public void schedule(TimerTask任务,Date firstTime,long period)

任务 - 这是要安排的任务。

firstTime - 这是第一次执行任务。

period - 这是连续任务执行之间的时间(以毫秒为单位)

答案 3 :(得分:0)

我在android中使用Timer来更新进度条。这是我的一些代码,希望它可以帮助你:

Timer timer ;

@Override
protected void onCreate(Bundle savedInstanceState) {

        //....

        timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                updateLogoBarHandler.sendEmptyMessage(0);
                Log.e("SplashActivity","updating the logo progress bar...");
         }}, 0, 50);

       //.....

}

//here do the timer.cancel();
private Handler updateLogoBarHandler = new Handler() {
    public void handleMessage(Message msg) {
        if(logobarClipe.getLevel() < 10000){
                logobarClipe.setLevel(logobarClipe.getLevel() + 50);  
        }else{
                timer.cancel();
        }  
        super.handleMessage(msg);
   }
};