0

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

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

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

编辑 我只想取消Timer给定事件的一个,有没有办法管理身份以便Timers我可以轻松找到并停止它?

4

4 回答 4

2

如果你有数千个,你应该使用一个ScheduledExecutorService来池线程,而不是一个 Timer,它每个定时器使用一个线程。

执行器服务在调度任务时返回的 ScheduledFutures 也有取消底层任务的 cancel 方法:future.cancel(true);.

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

于 2013-09-22T08:07:54.073 回答
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();
    }
}
于 2013-09-22T07:45:57.440 回答
0

使用此计划方法。

public void schedule(TimerTask task,Date firstTime,long period)

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

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

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

于 2013-09-22T08:01:33.777 回答
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);
   }
};
于 2014-10-25T10:55:15.027 回答