我使用Timer
和TimerTasks
来安排执行某些任务。某些任务必须重新安排。我需要一种机制来“命名”任务(例如通过字符串ID),这样我就可以重新安排它们或删除它们并在新的时间安排它们。
我正在研究的项目是飞行显示系统。插入数据库时的每个航班都有预定的到达和离开时间。因此,当必须显示航班时,我会使用一个计时器任务来更新机场显示,而另一个则用于隐藏它。
在飞行时间发生变化之前,一切都很好。用户更新数据库中的时间,但我需要重新安排显示更新时间。这是我需要你帮助的地方。
答案 0 :(得分:3)
您如何看待简单的HashMap<UUID, TimerTask> tasks
。您可以通过给定ID找到任何任务,取消它,或稍后重新安排。
<强>更新强>
public class TimerThingy{
HashMap<UUID,TimerTask> tasks = new HashMap<UUID,TimerTask>();
Timer timer = new Timer();
public UUID createAndStartTimer(final Runnable task, Date when){
TimerTask timerTask = new TimerTask(){
public void run(){
task.run();
}
}
timer.schedule(TimerTask timerTask, Date when);
UUID id = UUID.randomUUID();
tasks.put(id, t);
return id;
}
public void cancelTimer(UUID id){
tasks.get(id).cancel();
}
}
这是一种最简单的调度程序,可以取消ID。我想你可能会使用其他东西作为ID,因为你可能会找到正确的取消任务。但那取决于你......
答案 1 :(得分:1)
//您可以创建一个存储任务的地图,并按ID编制索引。
Map<String,TimerTask> tasks = new HashMap<String,TimerTask>();
您使用函数生成命名任务:
public TimerTask createTask(String name, final Runnable r){
TimerTask task = new TimerTask(){
public void run(){
r.run();
}
}
//here, you save it to the HashMap
tasks.put(name, task);
return task;
}
//必须显示航班时才会显示更新机场,而另一个航班则会隐藏它。
现在,要创建一个任务,您可以像以前一样创建runnable,并创建您希望它拥有的名称,例如fligthnumer-show或flightnumer-hide,然后调用该函数来创建任务。
Runnable r= ... //whatever you does here
String name = "1234-show";
TimerTask task = createTask( name, r);
现在,您可以安排任务,或做任何您需要的事情。此外,您的任务已保存,因此,如果您再次需要它,取消它或再次安排它,您只需要从hashmap中检索它,调用它的名称:
TimerTask task = tasks.get("1234-show");
在这个例子中,它并不是真正有用,但在您的实际应用程序中,例如,如果您正在创建任务,则很容易构建动态的任务列表。假设您必须安排一项任务来显示信息或新航班,这可能是您前一天已经完成的,或者可能是新航班。您可以检查是否已经有任务,如果有,您可以使用它,否则您将其创建并保存。
//say you have flight number in a var called flightNumber, and you are building a "show" task
String name= flightNumber+"show";
TimerTask task = tasks.get(name); //if the task is found, you can use it
//instead, f there is not such task, null will be returned, in that case, you create it.
if (null== task) {
//do al the required stuff, like get the runnable ready, and create the task
task = createTask( name, r);
}
//so here, you can do whatever you need with the task