2

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

2 回答 2

3

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

于 2013-08-20T05:44:54.023 回答
2

是的,这应该没问题 -如果您对按顺序运行的任务感到满意。从文档

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

有许多计划任务很好:

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

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

于 2013-08-20T05:42:37.083 回答