在下面的代码中,是否可以再次使用相同的timer1对象而不是timer2来调用timertask?
Timer timer1 = new Timer();
timer1.scheduleAtFixedRate(new TimerTask() {
int counter = 0;
@Override
public void run() {
PriorityQueueHandler.getQueueInstance().addToQueue(passengers.get(counter));
counter++;
if(counter == passengers.size()){
counter = 0;
}
}
}, DELAY, ARRIVAL_INTERVAL);
PriorityQueueHandler.getQueueInstance().print();
Timer timer2 = new Timer();
timer2.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
PriorityQueueHandler.getQueueInstance().print();
}
}, DELAY, BOOKING_INTERVAL);
答案 0 :(得分:3)
您可以为多个任务重用计时器实例。请注意,计时器在一个单个线程同步中执行所有任务,这意味着如果一个任务被停止,这将影响在同一个计时器上安排的其他任务,即其他任务将不会被执行。
答案 1 :(得分:2)
是的,那应该没问题 - 如果你对按顺序运行的任务感到满意。来自the docs:
对应每个Timer对象是一个后台线程,用于按顺序执行所有计时器的任务。计时器任务应该快速完成。如果计时器任务花费过多时间来完成,它会“占用”计时器的任务执行线程。反过来,这可以延迟后续任务的执行,这些后续任务可能会在违规任务最终完成时(以及如果)快速连续地“聚集”并执行。
完成许多计划任务很好:
实施说明:此类可扩展到大量并发计划的任务(数千个应该没有问题)。在内部,它使用二进制堆来表示其任务队列,因此调度任务的成本是O(log n),其中n是并发计划任务的数量。
就我个人而言,我可能会使用ScheduledExecutorService
来更好地控制创建的线程和任务之间的并发性,但这是一个稍微不同的事情。