Java: таймер и поток, который он создает - PullRequest
7 голосов
/ 19 декабря 2009

У меня есть вопрос:

У меня есть таймер. С scheduleAtFixedRate он создает новую задачу таймера. В этой задаче таймера есть определенный код, выполнение которого может занять некоторое время. Как я могу убедиться, что Таймер не создаст новую задачу, если предыдущая еще не выполнена?

Спасибо

Ответы [ 2 ]

18 голосов
/ 19 декабря 2009

Мой ответ - не использовать Timer, он устарел. Начиная с Java5, Timer был заменен на ScheduledExecutorService, который стал гораздо более гибким и простым в использовании. Вы получаете более точный контроль над тем, как работает планировщик, такого рода контроль, который вы не получаете с Timer.

Вы создаете класс с использованием фабричного класса Executors , который имеет несколько фабричных методов. Вы должны посмотреть на newSingleThreadScheduledExecutor , который должен делать именно то, что вы ищете:

Создает однопоточный исполнитель которые могут планировать команды для запуска после заданной задержки или выполнить периодически. Задачи гарантированы выполнять последовательно и не более одна задача будет активна в любой момент время.

Используя ScheduledExecutorService вместо подкласса TimerTask, вы напрямую создаете подкласс Runnable, а затем отправляете задачу исполнителю. У исполнителя есть различные методы, вам нужно выбрать, какой из них подходит для ваших нужд (внимательно прочитайте javadoc для ScheduledExecutorService), но суть примерно такая:

    // initialise the executor
    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

    while (tasksRemaining) {
        // create your task
        Runnable task = ....;
        // submit it to the executor, using one of the various scheduleXYZ methods
        executor.schedule(task, delay, unit);
    }

    // when everything is finished, shutdown the executor
    executor.shutdown();

Как всегда, прочитайте Javadoc.

3 голосов
/ 19 декабря 2009

Документ для класса Таймер

Каждый объект таймера соответствует один фоновый поток, который используется для выполнения всех таймера задачи, последовательно. Таймер задач должно завершиться быстро. Если таймер задача занимает слишком много времени для выполнения, он "затягивает" выполнение задачи таймера нить. Это может, в свою очередь, задержать выполнение последующих задач, которые может "сгруппироваться" и выполнить быстро правопреемство, когда (и если) нарушителя задание наконец завершено.

предполагает, что существует только одна фоновая нить. Поэтому я верю, что этот сценарий не произойдет.

...