我已经安排了一种方法,以便在将来某个日期运行;但是,某些事件可能会或可能不会在该日期之前发生,这意味着我希望在指定日期之前运行该方法;我怎样才能做到这一点?我目前有:
Timer timer = new Timer();
TimerTask task = new TaskToRunOnExpriation();
timer.schedule(task, myCalendarObject.getTime());
我会在我的应用程序中运行许多这些TimerTask
,如果某种情况发生,请停止它们的特定实例?
修改
我只想取消给定事件的单Timer
,是否有办法管理Timers
的身份,以便我可以轻松找到并停止它?
答案 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);
}
};