1. Обзор
Регулярно реализуя функцию выполнения задач в Java, в основном используя два класса, таймер и Timertask. Таймер используется для выполнения указанных задач в фоновом потоке в соответствии с указанным планом.
Timertask - это абстрактный класс, а его подкласс представляет собой задачу, которую можно запланировать Timer. Конкретный код, который будет выполнен, записан в методе запуска, который должен быть реализован Timertask.
2. Давайте посмотрим на самый простой пример
Давайте объясним это через код
import java.text.simpledateformat; import java.util.date; import java.util.timer; import java.util.timertask; открытый класс Timerdemo {public Static String getCurrentTime () {date Date = new Date (); SimpleDateFormat SDF = new SimpleDateFormat ("yyyy-mm-dd HH: MM: SS"); вернуть sdf.format (date); } public static void main (string [] args) бросает прерывания ErruptEdException {System.out.println ("Main Start:"+getCurrentTime ()); startTimer (); Thread.sleep (1000*5); // Сон в течение 5 секунд System.out.println ("Основной конец:"+getCurrentTime ()); } public static void starttimer () {timertask task = new TimerTask () {@Override public void run () {System.out.println ("Задача:"+getCurrentTime ()); }}; Таймер timer = new Timer (); timer.schedule (задача, 0); }}Чтобы облегчить информацию о наблюдении путем печати, мы добавили некоторую информацию о печати в основной метод и называют Thread.sleess, чтобы сделать основной поток. Кроме того, в класс добавляется метод GetCurrentTime, чтобы получить текущую дату.
В приведенном выше коде, в методе Starttimer создается объект Timertask (задача, выполняемая TIMER), создается объект таймера, и вызывается метод расписания класса таймера. Класс таймера имеет несколько методов расписания с различными параметрами. Здесь используется:
Общественное график пустоты (задача Timertask, долгая задержка)
Значение этого метода состоит в том, чтобы выполнить задачу задачи после того, как таймер задержит время (миллисекунд). Если задержка отрицательная или 0, задача будет выполнена немедленно. И это одноразовая задача выполнения, и задача не будет повторена (или запланированной) впоследствии выполнена.
Для класса таймера также предоставляется метод с той же функцией:
Общественное расписание void (задача Timertask, дата времени)
Разница между этим методом и приведенным выше методом заключается в том, что приведенный выше метод указывает, что выполнение задерживается в течение определенного периода времени, и этот метод указывает, что выполнение выполняется в определенный момент времени. Обратите внимание, что если текущее время системы превысило время, указанное временем параметра, задача будет выполнена немедленно.
При запуске приведенного выше кода мы обнаружили, что программа немедленно печатает две части информации, аналогичной следующей:
Основной старт: 2016-01-13 22:23:18
Запуск задачи: 2016-01-13 22:23:18
Поскольку значение параметра задержки, которое мы передаем методу графика, составляет 0, задача будет выполнена немедленно, поэтому время для печати двух операторов одинаково, что и должно быть. Вы можете изменить входящее значение задержки самостоятельно, чтобы увидеть изменения в выводной информации. Примерно через 5 секунд (то есть время сна) я продолжал печатать 1 сообщение:
Основной конец: 2016-01-13 22:23:23
Время для печати информации на 5 секунд не только приведенного выше утверждения, которое согласуется с настройкой сна, что также очень разумно.
Но мы найдем очень интересное явление, и мы обнаружим, что процесс не выйдет. В настоящее время основная нить закончилась. Это означает, что после того, как таймер выполнит задачу, даже если нет никаких задач, ожидающих выполнения позже, фоновый поток, созданный в таймере, не уйдет немедленно. Я проверил соответствующую документацию DOC Java и объяснил, что поток таймера не будет активно выйти и должен ждать сбора мусора, но сборка мусора Java не может контролироваться самим кодом, но контролируется виртуальной машиной.
После исследования было обнаружено, что при создании объекта таймера и выполнении таймера timer = new Timer (); Заявление, поток таймера будет создан. Другими словами, даже если приведенный выше код не имеет Timer.schedule (задача, 0); Заявление, программа не выйдет. Я чувствую, что это довольно неразумно. Я снова изучил исходный код класса таймера и обнаружил, что он также имеет конструктор с логическими параметрами:
Публичный таймер (логический исдан)
Как вы можете видеть из имени параметра, если значение параметра верно, поток таймера, созданный Timer, является потоком Daemon. Значение потока демона состоит в том, что когда все рабочие потоки на выходе процесса Java, поток демона автоматически выйдет.
В настоящее время нам просто нужно изменить код для создания объекта таймера в приведенном выше примере: Timer Timer = новый таймер (true);
После того, как вы обнаружите, что программа запускается, программа выйдет после того, как основной поток (основной поток не является потоком демона, а поток работника)), что означает, что поток таймера также выходит, что означает, что после добавления параметра True, созданный поток демона является потоком Daemon.
Но проблема в том, что в реальных сценариях приложений есть много рабочих потоков, и программа не выходит случайно. Так что, если вы хотите, чтобы таймер сразу же ушел или закрылся? Мы представим это ниже.
3. Выход таймера
Класс таймера предоставляет метод отмены для отмены таймера. Вызов метода отмены завершит этот таймер и отбросит все запланированные в настоящее время задачи. Это не мешает задачи выполнения в настоящее время (если она существует). Как только таймер будет прекращен, его поток выполнения также будет прекращен, и в соответствии с ним не может быть запланировано никакие задачи.
Обратите внимание, что, вызывая этот метод в методе выполнения задачи таймера, называемого этим таймером, вы можете абсолютно убедиться, что выполняемая задача является последней задачей, выполненной этим таймером. Этот метод можно называть неоднократно; Однако вторые и последующие вызовы недействительны.
Давайте посмотрим на другой пример кода:
import java.text.simpledateformat; import java.util.date; import java.util.timer; import java.util.timertask; открытый класс Timerdemo {public Static String getCurrentTime () {date Date = new Date (); SimpleDateFormat SDF = new SimpleDateFormat ("yyyy-mm-dd HH: MM: SS"); вернуть sdf.format (date); } public static void main (string [] args) бросает прерывания ErruptEdException {System.out.println ("Main Start:"+getCurrentTime ()); Таймер timer = startTimer (); Thread.sleep (1000*5); // Сон в течение 5 секунд System.out.println ("Основной конец:"+getCurrentTime ()); timer.cancel (); } public Static Timer startTimer () {timertask task = new TimerTask () {@Override public void run () {System.out.println ("Задача:"+getCurrentTime ()); }}; Таймер timer = new Timer (); timer.schedule (задача, 0); вернуть таймер; }} Запуск программы точно такой же, как и вывод приведенного выше примера. Разница в том, что когда основной метод заканчивается. Процесс будет активно выйти, что означает, что поток таймера был закрыт.
Потому что мы называем метод отмены в основном методе. Обратите внимание, что если вы не вызываете метод отмены в методе выполнения Timertask, обязательно убедитесь, что задача, которую вы хотите выполнить, началась или завершена, в противном случае, если задача не начала выполнять. Просто позвоните отмените, и все задачи не будут выполнены. Например, приведенный выше код,
Например, в приведенном выше коде, если мы не вызовым метод отмены в основном методе, а добавим timer.schedule (задача, 0); оператор в методе StartTimer и добавьте timer.cancel (); Заявление После запуска вы обнаружите, что задача таймера не будет выполнена, поскольку она будет отменена до завершения выполнения.
4. Регулярно выполнять задачи
В приведенном выше примере мы представляем единовременную задачу, то есть время таймера. После выполнения задачи она не будет повторена позже. В реальных приложениях существует много сценариев, которые требуют регулярного выполнения той же задачи. Есть две ситуации: одна - время от времени выполнять задачи, а другая - выполнять задачи в определенные (или несколько) моментов времени каждый день (или еженедельно, ежемесячно и т. Д.).
Давайте сначала рассмотрим первый случай, который является примером выполнения одной и той же задачи каждые 10 секунд. Код заключается в следующем:
import java.text.simpledateformat; import java.util.date; import java.util.timer; import java.util.timertask; открытый класс Timerdemo {public Static String getCurrentTime () {date Date = new Date (); SimpleDateFormat SDF = new SimpleDateFormat ("yyyy-mm-dd HH: MM: SS"); вернуть sdf.format (date); } public static void main (string [] args) бросает прерывания ErruptEdException {System.out.println ("Main Start:"+getCurrentTime ()); startTimer (); } public static void starttimer () {timertask task = new TimerTask () {@Override public void run () {System.out.println ("Задача:"+getCurrentTime ()); try {thread.sleep (1000*3); } catch (прерванное искусство e) {e.printstacktrace (); }}}; Таймер timer = new Timer (); timer.schedule (задача, 1000*5,1000*10); }} Выполните вышеуказанную программу, и выводная информация заключается в следующем (поскольку таймер не останавливается, а задача повторяется, выход непрерывно выводит. Здесь копируются только некоторые из предыдущих выходов).
Основной старт: 2016-01-14 08:41:14
Запуск задачи: 2016-01-14 08:41:19
Запуск задачи: 2016-01-14 08:41:29
Запуск задачи: 2016-01-14 08:41:39
Запуск задачи: 2016-01-14 08:41:49
Запуск задачи: 2016-01-14 08:42:00
Запуск задачи: 2016-01-14 08:42:10
Запуск задачи: 2016-01-14 08:42:20
Запуск задачи: 2016-01-14 08:42:30
Запуск задачи: 2016-01-14 08:42:40
В приведенном выше коде мы называем Timer.schedule (задача, 1000*5,1000*10); Это означает, что задача откладывается на 5 секунд, а затем она будет повторяться каждые 10 секунд. Мы наблюдаем, что время печати в выводной информации совпадает с ожидаемой. Кроме того, видно, что интервал рассчитывается на основе времени запуска задачи, то есть он не должен ждать еще 10 секунд после выполнения задачи.
У класса таймера есть два метода для реализации таких функций следующим образом:
Общественное расписание пустоты (задача Timertask, длительная задержка, длительный период) Общедоступное расписание (задача Timertask, дата первого периода, длительный период)
Первый метод, который мы используем выше кода. Разница между двумя методами - это время первого исполнения. Первый метод выполняется после указанной задержки периода времени (в миллисекундах); Второй метод выполняется в указанный момент времени.
В настоящее время мы рассмотрим следующий сценарий. Если время выполнения задачи превысит следующее время ожидания, что произойдет? Давайте посмотрим на это через код:
import java.text.simpledateformat; import java.util.date; import java.util.timer; import java.util.timertask; открытый класс Timerdemo {public Static String getCurrentTime () {date Date = new Date (); SimpleDateFormat SDF = new SimpleDateFormat ("yyyy-mm-dd HH: MM: SS"); вернуть sdf.format (date); } public static void main (string [] args) бросает прерывания ErruptEdException {System.out.println ("Main Start:"+getCurrentTime ()); startTimer (); } public static void startTimer () {timertask task = new TimerTask () {@Override public void run () {System.out.println ("Зачасть:"+getCurrentTime ()); try {thread.sleep (1000*10); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Задача:"+getCurrentTime ()); }}; Таймер timer = new Timer (); timer.schedule (задача, 1000*5,1000*5); }} По сравнению с предыдущим кодом, мы изменили только 2 кода и изменили печатную печать. Одним из них является изменение сна в методе прогона на 10 секунд, а другой - изменить цикл выполнения задачи на 5 секунд. Другими словами, время выполнения задачи превышает интервал между повторным выполнением задачи. Запустите программу, предыдущий вывод заключается в следующем:
Главный старт: 2016-01-14 09:03:51
Задача: 2016-01-14 09:03:56
Конец задачи: 2016-01-14 09:04:06
Задача: 2016-01-14 09:04:06
Конец задачи: 2016-01-14 09:04:16
Задача: 2016-01-14 09:04:16
Конец задачи: 2016-01-14 09:04:26
Задача: 2016-01-14 09:04:26
Конец задачи: 2016-01-14 09:04:36
Задача: 2016-01-14 09:04:36
Конец задачи: 2016-01-14 09:04:46
Задача: 2016-01-14 09:04:46
Конец задачи: 2016-01-14 09:04:56
Можно видеть, что после выполнения каждой задачи следующая задача будет выполнена немедленно. Поскольку время, взятое с начала задачи до завершения задачи, превысило интервал между повторением задачи, выполнение будет повторено.
5. Регулярно выполнять задачи (повторить фиксированный момент времени)
Давайте реализуем такую функцию, регулярно выполняем задачу в 1 часа ночи каждый день, который выполняет эту функцию во многих системах, таких как выполнение трудоемких и потребляющих ресурсов, таких как резервное копирование данных и статистика данных в этой задаче. Код заключается в следующем:
Импорт java.text.simpledateformat; import java.util.calendar; import java.util.date; import java.util.timer; import java.util.tilesk; public class timerdemo {public Static String getCurrentTime () {дата дата = новая дата (); SimpleDateFormat SDF = new SimpleDateFormat ("yyyy-mm-dd HH: MM: SS"); вернуть sdf.format (date); } public static void main (string [] args) бросает прерывания ErruptEdException {System.out.println ("Main Start:" + getCurrentTime ()); startTimer (); } public static void startTimer () {timertask task = new TimerTask () {@Override public void run () {System.out.println ("Зачасть:" + getCurrentTime ()); try {thread.sleep (1000 * 20); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Задача:" + getCurrentTime ()); }}; Таймер timer = new Timer (); timer.schedule (задача, buildtime (), 1000 * 60 * 60 * 24); } частная статическая дата BuildTime () {календарный календарь = calendar.getInstance (); calendar.set (calendar.hour_of_day, 1); Calendar.Set (Calendar.minute, 0); Calendar.Set (Calendar.second, 0); Дата времени = календарь.gettime (); if (time.tofore (new date ())) {// Если текущее время происходит после 1:00, необходим 1 день, в противном случае задача будет выполнена немедленно. // Многие системы часто должны немедленно выполнять задачи, когда система запускается, но им необходимо выполнять их в 1 часа ночи каждый день. Что я должен делать? // Это очень просто, просто выполните задачу отдельно, когда система инициализирует вызов (таймер не требуется, это просто код для выполнения этой задачи) time = addday (время, 1); } Время возврата; } частная статическая дата addday (дата даты, int days) {calendar startdt = calendar.getinstance (); startDT.SetTime (дата); startDT.Add (calendar.day_of_month, days); return startDt.getTime (); }}Поскольку он выполняется с интервалами 24 часа, невозможно ждать наблюдения за выходом.
6. Резюме
В этой статье представлен механизм выполнения временных задач с использованием класса таймера Java. Видно, что есть еще много способов обратить внимание. В примерах, представленных в этой статье, каждый таймер соответствует только одной задаче.
Содержание, представленное в этой статье, может соответствовать большинству сценариев приложений, но есть все еще некоторые проблемы, такие как включение нескольких задач для таймера? Могу ли я снова добавить задачи после отмены таймера? Какие еще методы доступны в классе таймера? Эти вопросы будут представлены в следующем сообщении в блоге.
Оригинальная ссылка: http://www.cnblogs.com/51kata/p/5128745.html
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.