Поиск по сайту:

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


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

Java TimerTask

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

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

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

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