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

Java 如何提前取消timer.schedule()调用,java,time,timer,Java,Time,Timer,我已计划在将来某个日期运行一个方法;但是,在该日期之前可能会或可能不会发生某些事件,这意味着我希望在指定日期之前运行该方法;我该怎么做?我目前有: Timer timer = new Timer(); TimerTask task = new TaskToRunOnExpriation(); timer.schedule(task, myCalendarObject.getTime()); 我将在我的应用程序中运行许多这样的TimerTask,如果发生某种情况,是否停止它们的特定实例 编辑 对

我已计划在将来某个日期运行一个方法;但是,在该日期之前可能会或可能不会发生某些事件,这意味着我希望在指定日期之前运行该方法;我该怎么做?我目前有:

Timer timer = new Timer();
TimerTask task = new TaskToRunOnExpriation();
timer.schedule(task, myCalendarObject.getTime());
我将在我的应用程序中运行许多这样的
TimerTask
,如果发生某种情况,是否停止它们的特定实例

编辑 对于给定的事件,我只想取消一个
计时器
,是否有一种方法可以管理
计时器的标识
,以便我可以轻松找到并停止它?

在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();
    }
}
类计时器
{
定时器1;
定时器2;
ArrayList时间列表;
公共计时器()
{
//安排计时器
}
//取消与事件相关的计时器
公开无效事件a(
{
timer1.cancel();
timer2.cancel();
}
公共无效事件b()
{
用于(计时器t:timerList)
t、 取消();
}
}

使用此计划方法

公共作废计划(TimerTask任务、首次日期、长周期)

任务——这是要计划的任务

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


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

如果有数千个任务执行,则应使用一个线程池,而不是一个计时器,该计时器将每个计时器使用一个线程

当您计划任务时,executor服务返回的ScheduledFuture还具有取消基础任务的cancel方法:
future.cancel(true)


至于取消正确的任务,您可以将未来存储在
地图中,以便您可以通过名称或id访问它们。

我使用android中的计时器更新进度条。以下是我的一些代码,希望它能帮助您:

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);
   }
};
定时器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//....
定时器=新定时器();
timer.schedule(新TimerTask(){
公开募捐{
updateLogoBarHandler.sendEmptyMessage(0);
Log.e(“SplashActivity”,“更新徽标进度条…”);
}}, 0, 50);
//.....
}
//这里是计时器。取消();
私有处理程序UpdateLogbarHandler=新处理程序(){
公共无效handleMessage(消息消息消息){
if(logobarClipe.getLevel()<10000){
logobarClipe.setLevel(logobarClipe.getLevel()+50);
}否则{
timer.cancel();
}  
超级handleMessage(msg);
}
};

尝试了
timer.cancel()
?如果数千个计时器正在启动,我如何识别合适的计时器?如何找到要停止的计时器?OP希望取消计时器,而不是对其进行调度。对于需要数千个未来的应用程序,调度程序是否使用了典型的/足够数量的线程?i、 e.
x
用于
x
中的
scheduledexecutorservice调度器=执行器。newScheduledThreadPool(x)@alh,我想强调一下@assylias说的话
您可以将未来存储在地图中,以便您可以通过名称或id访问它们,例如
——如果您希望在需要时控制某个集合,这是将其存储在集合中的常用方法。如果您在识别堆栈时遇到问题(需要关闭堆栈),则表明您选择了错误的应用程序体系结构。试着重新考虑事情。通常,您会与从基本类扩展而来的自定义类进行协商,在该类中,您会添加一个功能,以您需要的方式标识元素want@alh试着想想有多少任务可以并行运行,并使用这个数字+一个小缓冲区(除非这会导致一个太高的数字——你可能不想说100个线程——但这在很大程度上取决于你的用例)。