Как сделать таймер в java

Обновлено: 04.07.2024

Часто в программе нужно выполнять какие-то действия (дальше будем их называть задачами) периодически или согласно расписанию. J2ME поддерживает механизм, облегчающий реализацию этой задачи. Я говорю о таймере. Для того чтобы им воспользоваться, необходимо использовать два класса: java.util.TimerTask и java.util.Timer. Класс TimerTask является абстрактным, и служит основой для всех выполняемых по расписанию задач. Класс Timer обеспечивает создание и управление потоками, на которых выполняются эти задачи.

Наша задача должна быть реализована в субклассе класса TimerTask в методе run():

В данном случае задача сводится к выведению строки на экран.

После того, как задача запрограммирована, необходимо задать расписание ее выполнения. Для этого с помощью метода schedule() создается интерфейс класса Timer.

Вы можете задать расписание четырех типов: выполнять задачу в строго отведенное время (используется объект Date), после некоторой задержки (в миллисекундах), через определенные промежутки времени, через определенные промежутки времени после заданного начального момента времени (реализуется с помощью метода scheduleAtFixedRate) Если по каким, то причинам выполнение задачи отсрочено (скажем из-за уборки мусора), два или более последующих выполнения будут происходить через меньшие интервалы времени, чтобы наверстать упущенное и войти в первоначально намеченный график.

Каждый объект Timer создает и управляет лишь одним фоновым потоком. Большинству приложений вполне достаточно одного таймера, но Вы можете использовать любое их количество. Остановить таймер и уничтожить его поток можно, вызвав метод cancel(). Имейте в виду, остановленный таймер уже не может быть перезапущен - Вам придется создать новый и заново ввести расписание задач. Timer использует безопасные потоки, это значит, что Вам не надо выполнять их синхронизацию при использовании таймера из разных потоков.

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

Этот MIDlet использует объект Timer. Метод FieldMover выполняется каждые 100 миллисекунд. Он обновляет и перерисовывает звездное небо, опуская все звезды вниз на каждом интервале. Это создает иллюзию космического полета.

Класс 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 );

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

class Helper extends TimerTask

public static int i = 0 ;

public void run()

System.out.println( "Timer ran " + ++i);

public class Test

protected static Test obj;

public static void main(String[] args) throws InterruptedException

// создаем новый экземпляр класса timer

Timer timer = new Timer();

TimerTask task = new Helper();

// экземпляр объекта даты для исполнения с фиксированной ставкой

Date date = new Date();

timer.scheduleAtFixedRate(task, date, 5000 );

System.out.println( "Timer running" );

// заставляем основной поток ждать

// один раз таймер запланировал задачу 4 раза,

// основной поток возобновляется

// и завершает таймер

// очистка используется для удаления всех отмененных

// задачи из очереди timer's

Выход:

Ссылка:

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Для того, чтобы в фоновом режиме выполнить отчет времени, по истечению которого в вашем приложении должно произойти какое либо событие, можно использовать встроенный класс Timer и TimerTask. Сам класс Timer служит исключительно для отсчета времени, он может работать в двух режимах: одноразовое выполнение задания, либо же повторяющееся действие (например, напоминание, что у вас не лицензионная версия антивируса :). Метод TimerTask используется для описания действий, которые должны происходить по истечению времени отсчета в таймере Timer. То есть, здесь реализуется визуальное проявление работы таймера, иначе он просто будет считать себе в фоне и все без толку, никто о нем даже не узнает.

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

Создаем новый проект, выбираем Blank Activity. В файле activity_main.xml создаем интерфейс нашего приложения:

Теперь вся остальная работа будет происходить с помощью кода в MainActivity.java. Здесь мы выполняем стандартные шаги: объявляем используемые объекты, связываемся с элементами интерфейса. Ну и задаем Timer и метод для выполнения задачи по истечению таймера TimerTask:

Вот так выполняется реализация системного Android Timer. Пробуем запустить и смотрим на результат:

Таймер

Теперь сделаем немного сложнее - при истечении 5 секунд в таймере будем запускать второе окно приложения. Как создать второе окно и выполнять на него переход мы уже детально разбирали раньше.

Как вы уже поняли, все изменения будут касаться лишь времени таймера:

и описания действий в методе MyTimerTask :

Запускаем и тестируем:

переход совершен

Переход выполнен успешно! Как видите, Android Timer довольно простая и интересная вещь, теоретически в метод TimerTask можно запихнуть что угодно. Поэкспериментируйте! А еще освойте счетчик обратного отсчета CountDownTimer.

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

Первым делом необходимо создать экземпляр класса Timer :

Кстати, метод vibrate() объекта типа Display заставляет телефон вибрировать. В параметр нужно написать длительность вибрации в миллисекундах.

После того как созданы объекты таймер и задание, можно их запустить. Для этого у таймера есть методы:
1.

Помещают заданную задачу на исполнение в заданное время или с заданной отсрочкой. Если указанное время уже прошло, задача ставится на немедленное исполнение.

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

Аналогично предыдущей группе методов, но выполнение будет происходить с приоритетом абсолютной привязки по времени(и, как следствие, общего времени для фиксированного числа запусков), независимо от фактического времени предыдущего выполнения, возможно, с нарушением длительности интервалов.
Параметры delay и period указываются в миллисекундах.

Читайте также: