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个线程——但这在很大程度上取决于你的用例)。