Рубрики
Без рубрики

Пример задачи таймера Java TimerTask

Пример таймера Java. Пример задания времени Java. Пример расписания таймера Java, расширение абстрактного класса TimerTask, метод Timer scheduleAtFixedRate() и многое другое.

Автор оригинала: Pankaj Kumar.

Java java.util.Таймер – это служебный класс, который можно использовать для планирования выполнения потока в определенное время в будущем. Java-таймер класс может использоваться для планирования выполнения задачи один раз или через регулярные промежутки времени.

Временная задача Java

java.util.TimerTask – это абстрактный класс , который реализует управляемый интерфейс, и нам нужно расширить этот класс, чтобы создать нашу собственную TimerTask , которую можно запланировать с помощью java-таймера класса.

Пример таймера Java

Класс таймера Java потокобезопасен, и несколько потоков могут совместно использовать один Таймер объект без необходимости внешней синхронизации. Класс таймера использует java.util.TaskQueue для добавления задач с заданным регулярным интервалом и в любое время может быть только один поток, выполняющий задачу времени, например, если вы создаете таймер для запуска каждые 10 секунд, но выполнение одного потока занимает 20 секунд, то объект Timer будет продолжать добавлять задачи в очередь, и как только один поток будет завершен, он уведомит очередь, и другой поток начнет выполняться.

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

Вот простая программа для примера Java Timer и TimerTask.

package com.journaldev.threads;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask {

    @Override
    public void run() {
        System.out.println("Timer task started at:"+new Date());
        completeTask();
        System.out.println("Timer task finished at:"+new Date());
    }

    private void completeTask() {
        try {
            //assuming it takes 20 secs to complete the task
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String args[]){
        TimerTask timerTask = new MyTimerTask();
        //running timer task as daemon thread
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
        System.out.println("TimerTask started");
        //cancel after sometime
        try {
            Thread.sleep(120000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        timer.cancel();
        System.out.println("TimerTask cancelled");
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

Обратите внимание, что выполнение одного потока займет 20 секунд, но объект Java Timer запланирован для выполнения задачи каждые 10 секунд. Вот результат работы программы:

TimerTask started
Timer task started at:Wed Dec 26 19:16:39 PST 2012
Timer task finished at:Wed Dec 26 19:16:59 PST 2012
Timer task started at:Wed Dec 26 19:16:59 PST 2012
Timer task finished at:Wed Dec 26 19:17:19 PST 2012
Timer task started at:Wed Dec 26 19:17:19 PST 2012
Timer task finished at:Wed Dec 26 19:17:39 PST 2012
Timer task started at:Wed Dec 26 19:17:39 PST 2012
Timer task finished at:Wed Dec 26 19:17:59 PST 2012
Timer task started at:Wed Dec 26 19:17:59 PST 2012
Timer task finished at:Wed Dec 26 19:18:19 PST 2012
Timer task started at:Wed Dec 26 19:18:19 PST 2012
TimerTask cancelled
Timer task finished at:Wed Dec 26 19:18:39 PST 2012

Вывод подтверждает, что если задача уже выполняется, таймер будет ждать ее завершения, а после завершения она снова запустит следующую задачу из очереди.

Объект Java Timer может быть создан для выполнения связанных задач в качестве потока демона. Метод Timer cancel() используется для завершения таймера и отмены любых запланированных задач, однако он не мешает текущей выполняемой задаче и позволяет ей завершиться. Если таймер запускается как поток демона , независимо от того, отменяем мы его или нет, он завершится, как только все пользовательские потоки завершат выполнение.

Класс Timer содержит несколько методов schedule () для планирования выполнения задачи один раз в заданную дату или после некоторой задержки. Существует несколько методов scheduleAtFixedRate () для периодического выполнения задачи с определенным интервалом.

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