计时器实例是否可以在java中重用?

时间:2013-08-20 05:37:11

标签: java performance optimization timer timertask

在下面的代码中,是否可以再次使用相同的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);

2 个答案:

答案 0 :(得分:3)

您可以为多个任务重用计时器实例。请注意,计时器在一个单个线程同步中执行所有任务,这意味着如果一个任务被停止,这将影响在同一个计时器上安排的其他任务,即其他任务将不会被执行。

答案 1 :(得分:2)

是的,那应该没问题 - 如果你对按顺序运行的任务感到满意。来自the docs

  

对应每个Timer对象是一个后台线程,用于按顺序执行所有计时器的任务。计时器任务应该快速完成。如果计时器任务花费过多时间来完成,它会“占用”计时器的任务执行线程。反过来,这可以延迟后续任务的执行,这些后续任务可能会在违规任务最终完成时(以及如果)快速连续地“聚集”并执行。

完成许多计划任务很好:

  

实施说明:此类可扩展到大量并发计划的任务(数千个应该没有问题)。在内部,它使用二进制堆来表示其任务队列,因此调度任务的成本是O(log n),其中n是并发计划任务的数量。

就我个人而言,我可能会使用ScheduledExecutorService来更好地控制创建的线程和任务之间的并发性,但这是一个稍微不同的事情。