Elettracompany.com

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Класс timer java

Таймер — классы Timer и TimerTask

Классы Timer и TimerTask из пакета java.util позволяют планировать запуск задания на определённое время в будущем. Вы можете создать поток, выполняющий в фоновом режиме и ожидающий заданное время. Когда время истечёт, задача, связанная с этим потоком, будет запущена. С помощью параметров можно запланировать задачу на повторяющий запуск либо на запуск по определённой дате. Вам не нужно создавать поток с помощью класса Thread, так как таймер упрощает эту задачу.

Учитывайте обстоятельство, что таймер выполняется в своём потоке и не должнен задействовать UI-элементы, которые выполняются в своём потоке. Для решения этой проблемы можете использовать метод runOnUiThread() для обновления данных у компонентов.

Классы Timer и TimerTask работают в связке. Класс Timer используется для планирования выполнения задачи. Запланированная к выполнению задача должна быть экземпляром класса TimerTask. Вы сначала создаёте объект класса TimerTask, а затем планируете его запуск с помощью класса Timer.

Класс TimerTask реализует интерфейс Runnable и может быть использован для создания потока выполнения.

В классе TimerTask имеется абстрактный метод run(), который следует переопределить. Метод должен содержать исполняемый код.

Метод cancel() прерывает задание и возвращает значение true, если выполнение задания прервано.

Метод scheduleExecutionTime() возвращает время, на которое последний раз планировался запуск задания.

Как только задача создана, она планируется для выполнения объектом класса Timer.

Методы класса Timer:

  • void cancel() — прерывает поток таймера
  • int purge() — удаляет прерванные задания из очереди таймера
  • void schedule (TimerTask task, long delay) — задание task планируется к выполнению через период в миллисекундах, переданный в параметре delay
  • void schedule (TimerTask task, long delay, long period) — задание task планируется к выполнению через период в миллисекундах, переданный в параметре delay. Затем задание повторяется повторно периодически — каждые period миллисекунд
  • void schedule (TimerTask task, Date when) — задание task планируется на время, указанное в параметре when
  • void schedule(TimerTask task, Date when, long period) — задание task планируется на время, указанное в параметре when. Затем задание выполняется повторно периодически — каждые period миллисекунд
  • void scheduleAtFixedRate (TimerTask task, long delay, long period) — задание task планируется к выполнению через период в миллисекундах, переданный в параметре delay. Затем задание выполняется повторно периодически — каждые period миллисекунд. Время каждого повтора задаётся относительно первого запуска.
  • void scheduleAtFixedRate (TimerTask task, Date when, long period) — задание task планируется к выполнению на время, указанное в параметре when. Задание затем выполняется повторно периодически — каждые period миллисекунд. Время каждого повтора задаётся относительно первого запуска.

Между методами schedule() и scheduleAtFixedRate() есть небольшая разница, которая заключается в разном поведении, которое зависит от стартовой точки запуска. Так второй метод работает как startTime + iterationNumber * delayTime и помнит время запуска. А обычный метод schedule() помнит последнее время выполнения и работает по формуле lastExecutionTime + delayTime. Для быстрых операций это не сильно отличается, а при ресурсоёмких задач разница будет заметна, например, при работе сборщика мусора приложение может притормозить и следующая задача может запуститься чуть позже.

Как только объект класса Timer создан, запуск планируется вызовом его метода schedule() и его родственника (см. выше).

Запускаем таймер

Напишем простой пример. Подготовим разметку.

Будем использовать два варианта таймера — одиночное и периодическое срабатывание.

Генерируем случайные показания

Допустим нам нужны ежедневные показания термометра. Но мы не можем ждать весь день при написании программ. Поэтому мы можем случайным образом создавать показания с небольшим интервалом и проверить поведение приложения.

Для удобства создадим отдельный класс-утилиту.

Создадим в классе активности метод для генерации значений и вызовем в onCreate().

Класс Java.util.Timer в Java

Класс Timer предоставляет вызов метода, который используется потоком для планирования задачи, например, выполнение блока кода после некоторого регулярного момента времени. Каждое задание может быть запланировано для запуска один или несколько раз. Каждый объект таймера связан с фоновым потоком, который отвечает за выполнение всех задач объекта таймера.
Замечания:

  • Класс таймера является потокобезопасным.
  • Класс таймера использует структуру данных двоичной кучи для хранения своей задачи.

Конструкторы:

  • Таймер () : создает новый таймер
  • Timer (boolean isDaemon) : создает новый таймер, связанный поток которого может быть указан для запуска в качестве демона
  • Timer (String name) : создает новый таймер, связанный поток которого имеет указанное имя
  • Таймер (строковое имя, логическое значение isDaemon) : создает новый таймер, связанный поток которого имеет указанное имя, и его можно указать для запуска в качестве демона.

Декларация:

Методы, унаследованные от класса java.lang.Object

  • клон
  • равно
  • финализации
  • GetClass
  • хэш-код
  • поставить в известность
  • notifyAll
  • нанизывать
  • Подождите

Методы:

  1. cancel (): java.util.Timer.cancel () Завершает этот таймер, отбрасывая все текущие запланированные задачи. Не мешает выполнению текущей задачи (если она существует). Как только таймер был прерван, его поток выполнения завершается изящно, и на нем больше не может быть запланировано никаких задач.
    Синтаксис:
  2. purge (): java.util.Timer.purge () Удаляет все отмененные задачи из очереди задач этого таймера
    Синтаксис:
  3. schedule (задача TimerTask, дата и время): java.util.Timer.schedule (задача TimerTask, время и время) Планирует выполнение указанной задачи в указанное время
    Синтаксис:
  4. schedule (задача TimerTask, дата firstTime, длинный период): java.util.Timer.schedule (задача TimerTask, дата firstTime, длинный период) Планирует указанную задачу для повторного выполнения с фиксированной задержкой, начиная с указанного времени
    Синтаксис:

// Java-программа для демонстрации
// планируем вызовы метода класса Timer

class Helper extends TimerTask

public static int i = 0 ;

public void run()

System.out.println( «Timer ran » + ++i);

public class Test

public static void main(String[] args)

Timer timer = new Timer();

TimerTask task = new Helper();

timer.schedule(task, 2000 , 5000 );

  • schedule (задача TimerTask, длительная задержка): java.util.Timer.schedule (задача TimerTask, длительная задержка) Планирует выполнение указанной задачи после указанной задержки
    Синтаксис:
  • schedule (задача TimerTask, длинная задержка, длинный период): java.util.Timer.schedule (задача TimerTask, длинная задержка, длинный период) Планирует указанную задачу для повторного выполнения с фиксированной задержкой, начиная с указанной задержки Синтаксис:
  • scheduleAtFixedRate (задача TimerTask, дата firstTime, длительный период): java.util.Timer.scheduleAtFixedRate (задача TimerTask, дата firstTime, длительный период) Планирует указанную задачу для повторного выполнения с фиксированной скоростью, начиная с указанного времени Синтаксис:
  • scheduleAtFixedRate (задача TimerTask, длительная задержка, длительный период): java.util.Timer.scheduleAtFixedRate (задача TimerTask, длительная задержка, длительный период) Планирует указанную задачу для повторного выполнения с фиксированной скоростью, начиная с указанной задержки Синтаксис:

    // Java-программа для демонстрации
    // scheduleAtFixedRate метод класса Timer

    Timer Class in Java Example | Java Timer Class Tutorial

    In programming, there are many tasks that must be scheduled either to run once or for a repeated number of times. In Java, this can be achieved with the help of the Timer class. The Timer class calls a method that is responsible for scheduling any task. Various threads can use this method, and thus the Timer class is said to be thread-safe.

    Timer Class in Java

    Timer class is thread-safe. Timer class uses a binary heap data structure to store its task. The Timer class uses a binary heap data structure for storing the tasks. The binary heap is a complete binary tree that satisfies the property of heap order. Each node of this binary tree represents a task in the Timer class.

    The Timer class, like all the other classes, inherits from the Object class. Therefore, the declaration of the Timer class is as follows:

    But, by default, as every class inherits from the Object class, there is no need to mention the Object class in is a declaration. Therefore, It is okay to write the above code as follows.

    Now, whenever we create an object of the Timer class, its constructor will be called. The Timer class contains overloaded constructors in its body. Let us have a look at the types of constructors of the Timer class.

    #Default Constructor

    #Timer()

    The following constructor is used to create a new timer whenever an object of Timer class is created with no arguments passed to it.

    #Timer(boolean isDaemon)

    Here, a new timer is created whose thread may be working as a Daemon. If this is so, the isDaemon returns a true value.

    #Timer(String s)

    This is used to create a timer whose associated thread has a name specified.

    #Timer(String s, boolean isDaemon)

    In this case, a timer class is created whose associated String has a name specified, and the thread may be working as a Daemon thread.

    The packages to be included while working with the timer class are the following.

    And for the task which needs to be scheduled, we use the following package.

    Now, let us have a look at the various schedule methods which belong to the Timer class.

    Note: All these schedule methods are public, and they do not return any value.

    #Timer Class Methods

    #schedule(TimerTask task, Date time)

    The scheduling method takes in two arguments: the first one is the task which needs to be scheduled, and the second one is the time at which the task needs to be scheduled to be executed.

    This method is used in cases where the task is to be scheduled only once.

    #schedule(TimerTask task, Date firstTime, long period)

    This method takes three arguments: the first again being the task which needs to be scheduled, the other is the Time at which the task needs to be executed for the first time, and the third argument is the time period after which the task needs to be executed again.

    This method is used in cases where the task is to be executed repeatedly after a fixed time period.

    #schedule(TimerTask task, long delay)

    In this method, the task is scheduled after a particular time delay.

    #schedule(TimerTask task, long delay, long period)

    This method takes three arguments, in which the first one is the task that needs to be scheduled, the second one is the delay before the first execution of the task, and the third argument is the time in milliseconds which should be there between every single execution of the task.

    Let us have a look at the following example which prints the message to remind the user to drink water.

    See the following output.

    Apart from these, the following are various scheduling methods which execute a task for a fixed rate.

    #scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

    The scheduleAtFixedRate() method is similar to the following schedule method:

    schedule(TimerTask task,Date firstTime,long period)

    The only difference is that the schedules are specified to execute repeatedly for a fixed-rate of time.

    #scheduleAtFixedRate(TimerTask task, long delay, long period)

    The scheduleAtFixedRate() method is also similar to the following schedule method: schedule(TimerTask task, long delay, long period) and takes the same types of arguments. The difference is again in the fixed rate of repeated execution of the scheduled tasks.

    There are also some more methods apart from the schedule and scheduleAtFixedRate methods that are inherited from the Object class and play an important role in scheduling tasks. A few of them are as follows:

    #cancel()

    The java.util.Timer.cancel() method terminates the Timer and discards all the scheduled tasks. However, the currently executing task is not interfered in between.

    See the following syntax.

    #purge()

    The java.util.Timer.purge() removes all the canceled tasks from the timers queue and returns the number of tasks that it has removed.

    See the following syntax.

    Finally, the Timer Class in Java Example Tutorial is over.

    Ankit Lathiya is a Master of Computer Application by education and Android and Laravel Developer by profession and one of the authors of this blog.

    Java Timer and TimerTask Example

    Instantiate Timer

    Create a Task using TimerTask

    How to Cancel a Timer

    Difference between Timer schedule() and scheduleAtFixedRate()

    Find the difference between Timer schedule() and scheduleAtFixedRate() methods.

    schedule() : It repeats a task with a given delay corresponding to previous execution. Suppose a task has been scheduled to execute after every 2 seconds and suppose E denotes execution and W denotes waiting of one second. The three consecutive executions can be represented as below.

    The total delay is of 4 seconds in three execution.
    This means that first execute(E), then wait for 2 seconds(WW), then execute(E) then wait for two seconds(WW) then execute(E). Now suppose if there is a delay of two seconds just before second execution because of System GC (garbage collector) or any other reason, then consecutive execution will be as below.

    Here the three executions take total delay of 6 seconds.

    scheduleAtFixedRate() : It repeats a task with a given fixed rate corresponding to first execution. In normal situation there is no difference between schedule() and scheduleAtFixedRate() . But when there is a delay in any execution because of System GC (garbage collector) or any other reason, then next 2, 3 executions can happen consecutively to recover the fixed rate corresponding to first execution. Now we will take again the same scenario of where second execution gets two seconds delay because of System GC. In this case, the repeating can be represented as below.

    The total delay time is 4 seconds only.

    Timer schedule() for One Time Execution

    Find the schedule() method to schedule a task on a given date or with a given delay that will execute only once.
    schedule(TimerTask task, Date time): Here task is the instance of TimerTask and time is the Date instance at which task will be executed.
    schedule(TimerTask task, long delay) : Task will start after given delay in milliseconds.

    Find the example.
    ScheduleDemoOne.java

    Timer schedule() for Repeating Execution

    schedule() can schedule a repeating task with a given period. The given period is counted from the previous execution. If an execution is delayed then all the subsequent execution will be delayed. To start a repeating task with an interval, we need to pass following arguments.
    schedule(TimerTask task, Date firstTime, long period): Task will start on the given date and will repeat with given period.
    schedule(TimerTask task, long delay, long period): Task will start with given delay and will repeat with given period.

    Find the example.
    ScheduleDemoTwo.java

    Timer scheduleAtFixedRate() for Repeating Execution

    scheduleAtFixedRate() schedules a repeating task with given period. If any execution is delayed then it executes 2-3 tasks consecutively to maintain the fixed rate corresponding to start time.
    scheduleAtFixedRate(TimerTask task, Date firstTime, long period) : Task will start on the given date and will repeat with given period.
    scheduleAtFixedRate(TimerTask task, long delay, long period) : Task will start with given delay and will repeat with given period.

    Сбрасываемый Таймер Java

    Я хотел бы иметь java.а utils.Таймер с возможностью сброса времени в java.Мне нужно установить однократное событие в X секундах. Если между временем создания таймера и X секундами ничего не происходит, событие происходит как обычно.

    Если, однако, до истечения X секунд, я решаю, что событие должно произойти после Y секунд, то я хочу иметь возможность сказать таймеру сбросить свое время, чтобы событие произошло в y секунд. Е. Г. таймер должен быть в состоянии сделайте что-нибудь вроде:

    Я не вижу способа сделать это с помощью таймера utils, как будто вы вызываете cancel (), вы не можете запланировать его снова.

    единственный способ приблизиться к репликации этого поведения-использовать javax.качать.Таймер и включает в себя остановку оригинального таймера и создание нового. т. е.:

    есть ли более простой способ??

    8 ответов

    по словам Timer документация, в Java 1.5 и далее, вы должны предпочесть ScheduledThreadPoolExecutor . (Вы можете создать этого исполнителя, используя Executors .newSingleThreadScheduledExecutor() для простоты использования; он создает что-то вроде Timer .)

    самое классное, когда вы планируете задачу (позвонив schedule() ), она возвращает ScheduledFuture на OpenJDK версия должна была это сказать:

    Java 5.0 представлял java.util.concurrent пакета и одна из утилит параллелизма в ScheduledThreadPoolExecutor который является пулом потоков для многократно выполнение задач с заданной скоростью или задержкой. Это более эффективно универсальная замена для Timer / TimerTask комбинация, по мере того как она позволяет множественным потокам обслуживания, признавает различное единицы времени, и не требует подклассов TimerTask (просто реализовать Runnable ). Конфигурирование ScheduledThreadPoolExecutor С одним потоком делает его эквивалентным Timer .

    Если Timer только когда-либо будет иметь одну задачу для выполнения, тогда я бы предложил подклассы:

    вам нужно будет работать над кодом, чтобы добавить проверки для неправильного использования, но он должен достичь того, что вы хотите. The ScheduledThreadPoolExecutor похоже, не имеет встроенной поддержки для переназначения существующих задач, но аналогичный подход должен работать и там.

    весь фрагмент кода выглядит так . Надеюсь, это будет помощь полная

    вам нужно запланировать повторяющуюся задачу? В этом случае я рекомендую вам рассмотреть возможность использования кварцевые.

    Я не думаю, что это можно делать с Timer/TimerTask , но в зависимости от того, чего именно вы хотите достичь, вы можете быть довольны использованием java.util.concurrent.ScheduledThreadPoolExecutor .

    Это то, что я пытаюсь. У меня есть класс, который опрашивает базу данных каждые 60 секунд с помощью TimerTask.

    в моем основном классе я сохраняю экземпляр таймера и экземпляр моего локального подкласса TimerTask. основной класс имеет метод для установки интервала опроса (скажем, от 60 до 30). в нем я отменяю свою TimerTask (который является моим подклассом, где я перезаписал метод cancel (), чтобы сделать некоторую очистку, но это не должно иметь значения), а затем сделать его нулевым. я воссоздаю новую экземпляр it и запланировать новый экземпляр на новом интервале в существующем таймере.

    поскольку сам таймер не отменяется, поток, который он использовал, остается активным (и так же, как и любые другие TimerTasks внутри него), а старая TimerTask заменяется новой, которая оказывается такой же, но VIRGIN (так как старая была бы выполнена или запланирована, она больше не является VIRGIN, как требуется для планирования).

    когда я хочу выключить весь таймер, я отменить и null TimerTask (так же, как и при изменении времени, снова для очистки ресурсов в моем подклассе TimerTask), а затем я отменяю и null сам таймер.

    вот пример для сбрасываемого таймера . Попробуйте изменить его для вашего убеждения.

    в этом примере печатается текущая дата и время каждые 5 секунд. Но если вы дадите какой-либо вход в консоль, таймер будет задержан для выполнения данной задачи ввода.

    Я сделал собственный класс таймера для аналогичной цели; не стесняйтесь использовать его:

    Читать еще:  Java lang thread run
  • Ссылка на основную публикацию
    Adblock
    detector