Как засечь время выполнения программы java

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

Задачи таймера должны завершиться быстро. Если задача таймера занимает время, чтобы завершиться, это «пожиратели ресурсов» поток выполнения задачи таймера. Это может, поочередно, задержать выполнение последующих задач, которые могут «сгруппировать» и выполниться в быстрой последовательности, когда (и если) незаконная задача наконец завершается.

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

Вычислительная сложность алгоритма

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

Если поток выполнения задачи таймера неожиданно завершится, например, потому что его метод stop вызывается, дальше попытайтесь запланировать задачу на таймер, то приведет к IllegalStateException, как будто метод cancel таймера был вызван. Этот класс ориентирован на многопотоковое исполнение: многократные потоки могут совместно использовать единственный объект Timer без потребности во внешней синхронизации.

Этот класс не предлагает гарантий в реальном времени: это планирует задачи, используя метод Object.wait(long). Java 5.0 представлял java.util.concurrent пакет и одна из утилит параллелизма там ScheduledThreadPoolExecutor который является пулом потоков для того, чтобы неоднократно выполнить задачи на данном уровне или задержке. Это — эффективно более универсальная замена для Timer / TimerTask комбинация, поскольку это позволяет многократные потоки службы, принимает различные единицы измерения времени, и не требует разделения на подклассы TimerTask (только реализация Runnable ). Конфигурирование ScheduledThreadPoolExecutor с одним потоком делает это эквивалентным Timer . Примечание реализации: Эти масштабы класса к большим количествам одновременно запланированных задач (тысячи не должны представить проблему). Внутренне, это использует двоичную «кучу», чтобы представить ее очередь задачи, таким образом, стоимость, чтобы запланировать задачу является O (зарегистрируйте n), где n является числом одновременно запланированных задач. Примечание реализации: Все конструкторы запускают поток таймера.

Сводка конструктора

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

Выпуск 31. Запуск по расписанию — ScheduledExecutorService.

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

Сводка метода

Методы Модификатор и Тип Метод и Описание
void cancel()

Завершает этот таймер, отбрасывая любые в настоящий момент запланированные задачи.
Удаляет все отмененные задачи из очереди задачи этого таймера.
Планирует указанную задачу для выполнения в требуемое время.

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

Планирует указанную задачу для выполнения после указанной задержки.

Планирует указанную задачу для повторного выполнения фиксированной задержки, начинаясь после указанной задержки.

Планирует указанную задачу для повторного выполнения с фиксированной процентной ставкой, начинающегося в требуемое время.

Планирует указанную задачу для повторного выполнения с фиксированной процентной ставкой, начинаясь после указанной задержки.

Методы java.lang унаследованный от класса. Объект

Деталь конструктора

Таймер

public Timer()
Создает новый таймер. Связанный поток не работает как демон.

Таймер

public Timer(boolean isDaemon)

Создает новый таймер, связанный поток которого может быть определен, чтобы работать как демон.

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

Таймер

public Timer(String name)

Создает новый таймер, у связанного потока которого есть указанное имя. Связанный поток не работает как демон.

Читайте также:
Установить время в программе 1 с

Таймер

public Timer(String name, boolean isDaemon)

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

Деталь метода

расписание

public void schedule(TimerTask task, long delay)
Планирует указанную задачу для выполнения после указанной задержки.

расписание

public void schedule(TimerTask task, Date time)

Планирует указанную задачу для выполнения в требуемое время.

Если время будет в прошлом задачей, то планируется для непосредственного выполнения.

расписание

public void schedule(TimerTask task, long delay, long period)

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

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

В конечном счете частота выполнения обычно будет немного ниже чем обратная величина установленного периода (принимающий системные часы, базовый Object.wait(long) точен). Выполнение фиксированной задержки является подходящим для повторяющихся действий, которые требуют «гладкости». Другими словами для действий уместно, где более важно сохранить частоту точной вскоре чем в конечном счете. Это включает большинство задач анимации, таких как мигание курсором равномерно. Это также включает задачи в чем, регулярное действие выполняется в ответ на человеческий ввод, такой как автоматическое повторение символа, пока ключ удерживается.

расписание

public void schedule(TimerTask task, Date firstTime, long period)

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

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

В конечном счете частота выполнения обычно будет немного ниже чем обратная величина установленного периода (принимающий системные часы, базовый Object.wait(long) точен). Как следствие вышеупомянутого, если запланированный первый раз в прошлом, он планируется для непосредственного выполнения.

Выполнение фиксированной задержки является подходящим для повторяющихся действий, которые требуют «гладкости». Другими словами для действий уместно, где более важно сохранить частоту точной вскоре чем в конечном счете. Это включает большинство задач анимации, таких как мигание курсором равномерно. Это также включает задачи в чем, регулярное действие выполняется в ответ на человеческий ввод, такой как автоматическое повторение символа, пока ключ удерживается.

scheduleAtFixedRate

public void scheduleAtFixedRate(TimerTask task, long delay, long period)

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

В выполнении с фиксированной процентной ставкой каждое выполнение планируется относительно запланированного времени выполнения начального выполнения. Если выполнение будет задержано по какой-либо причине (такой как сборка «мусора» или другое фоновое действие), то два или больше выполнения произойдет в быстрой последовательности, чтобы «нагнать.» В конечном счете частота выполнения будет точно обратной величиной установленного периода (принимающий системные часы, базовый Object.wait(long) точен). Выполнение с фиксированной процентной ставкой является подходящим для повторяющихся действий, которые чувствительны к абсолютному времени, таковы как вызов звона каждый час на часе, или выполнении запланированного обслуживания каждый день в определённое время. Для повторяющихся действий также уместно, где полное время, чтобы выполнить постоянное число выполнения важно, таково как таймер обратного отсчета, который отсчитывает однажды каждую секунду в течение десяти секунд. Наконец, выполнение с фиксированной процентной ставкой является подходящим для планирования многократных задач таймера повторения, которые должны остаться синхронизируемыми относительно друг друга.

scheduleAtFixedRate

public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

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

Читайте также:
Как окончательно удалить программу с компьютера

В выполнении с фиксированной процентной ставкой каждое выполнение планируется относительно запланированного времени выполнения начального выполнения. Если выполнение будет задержано по какой-либо причине (такой как сборка «мусора» или другое фоновое действие), то два или больше выполнения произойдет в быстрой последовательности, чтобы «нагнать.» В конечном счете частота выполнения будет точно обратной величиной установленного периода (принимающий системные часы, базовый Object.wait(long) точен).

Как следствие вышеупомянутого, если запланированный первый раз является в прошлом тогда каким-либо «пропущенным» выполнением, будет запланирован для непосредственного, «схватывают» выполнение. Выполнение с фиксированной процентной ставкой является подходящим для повторяющихся действий, которые чувствительны к абсолютному времени, таковы как вызов звона каждый час на часе, или выполнении запланированного обслуживания каждый день в определённое время. Для повторяющихся действий также уместно, где полное время, чтобы выполнить постоянное число выполнения важно, таково как таймер обратного отсчета, который отсчитывает однажды каждую секунду в течение десяти секунд. Наконец, выполнение с фиксированной процентной ставкой является подходящим для планирования многократных задач таймера повторения, которые должны остаться синхронизируемыми относительно друг друга.

отмена

public void cancel()

Завершает этот таймер, отбрасывая любые в настоящий момент запланированные задачи. Не вмешивается в в настоящий момент выполняющуюся задачу (если она существует). Как только таймер был завершен, его поток выполнения завершается корректно, и больше задач не может быть запланировано на него.

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

чистка

public int purge()

Удаляет все отмененные задачи из очереди задачи этого таймера. Вызов этого метода не имеет никакого эффекта на поведение таймера, но устраняет ссылки на отмененные задачи от очереди. Если нет никаких внешних ссылок на эти задачи, они становятся имеющими право на сборку «мусора». У большинства программ не будет никакой потребности вызвать этот метод.

Это разрабатывается для использования редким приложением, которое отменяет большое количество задач. Вызов этого метода обменивает время на пространство: время выполнения метода может быть пропорциональным n + c, регистрируют n, где n является числом задач в очереди, и c является числом отмененных задач. Отметьте, что допустимо вызвать этот метод изнутри задача, запланированная на этот таймер.

Платформа Java™
Стандарт Эд. 7

Источник: spec-zone.ru

Пример использования Java Timer и TimerTask

Пример использования Java Timer и TimerTask

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

Класс java.util.TimerTask является абстрактным классом, который реализует интерфейс Runnable. Мы должны унаследоваться от этого класса, создавая наш собственный TimerTask.

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

Класс Timer использует методы wait() и notify() для планирования задач.

Java Timer и TimerTask. Практика

Давайте на примере рассмотрим использование Timer и TimerTask в Java:

package ua . com . prologistic ;
import java . util . Date ;
import java . util . Timer ;
import java . util . TimerTask ;
public class MyTimerTask extends TimerTask <
public void run ( ) <
System . out . println ( «TimerTask начал свое выполнение в:» + new Date ( ) ) ;
completeTask ( ) ;
System . out . println ( «TimerTask закончил свое выполнение в:» + new Date ( ) ) ;
private void completeTask ( ) <
// допустим, выполнение займет 20 секунд
Thread . sleep ( 20000 ) ;
> catch ( InterruptedException e ) <
e . printStackTrace ( ) ;
public static void main ( String args [ ] ) <
TimerTask timerTask = new MyTimerTask ( ) ;
// стартуем TimerTask в виде демона
Timer timer = new Timer ( true ) ;
// будем запускать каждых 10 секунд (10 * 1000 миллисекунд)
timer . scheduleAtFixedRate ( timerTask , 0 , 10 * 1000 ) ;
System . out . println ( «TimerTask начал выполнение» ) ;
// вызываем cancel() через какое-то время
Thread . sleep ( 120000 ) ;
> catch ( InterruptedException e ) <
e . printStackTrace ( ) ;
timer . cancel ( ) ;
System . out . println ( «TimerTask прекращена» ) ;
Thread . sleep ( 30000 ) ;
> catch ( InterruptedException e ) <
e . printStackTrace ( ) ;

Читайте также:
Как работать с программой r keeper

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

TimerTask начал выполнение
TimerTask начал свое выполнение в : Mon Nov 09 11 : 23 : 39 PST 2015
TimerTask закончил свое выполнение в : Mon Nov 09 11 : 23 : 59 PST 2015
TimerTask начал свое выполнение в : Mon Nov 09 11 : 23 : 59 PST 2015
TimerTask закончил свое выполнение в : Mon Nov 09 11 : 24 : 19 PST 2015

TimerTask начал свое выполнение в : Mon Nov 09 11 : 24 : 19 PST 2015
TimerTask закончил свое выполнение в : Mon Nov 09 11 : 24 : 39 PST 2015
TimerTask начал свое выполнение в : Mon Nov 09 11 : 24 : 39 PST 2015
TimerTask закончил свое выполнение в : Mon Nov 09 11 : 23 : 59 PST 2015
TimerTask начал свое выполнение в : Mon Nov 09 11 : 23 : 59 PST 2015
TimerTask закончил свое выполнение в : Mon Nov 09 11 : 24 : 19 PST 2015
TimerTask начал свое выполнение в : Mon Nov 09 11 : 24 : 19 PST 2015

TimerTask прекращен
TimerTask закончил свое выполнение в : Mon Nov 09 11 : 24 : 39 PST 2015

Результат выполнения подтверждает, что если задача уже выполняется, то Timer будет ждать её до конца. Когда он закончил одну задачу, то сразу же начнет следующую задачу из очереди.

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

Класс Таймер содержит несколько методов schedule() , чтобы запланировать задачу на одноразовое выполнение в указанное время или регулярное выполнение с определенной задержкой. Есть несколько методов scheduleAtFixedRate () для периодического запуска задачи с определенным интервалом.

Вот и все, что нужно знать о работе с Java Timer и TimerTask в Java. Следите за обновлениями сайта и разделом Многопоточность в Java.

Источник: javadevblog.com

KrOlSer’s Weblog

и мы хотим померять производительность метода m(), то можем поменять его например так:

public class C < public void m() throws Exception < long timer = -System.currentTimeMillis(); // do doSomething timer += System.currentTimeMillis(); System.out.println(«C.m() » + timer); >>

Потом снимаих результаты с консоли и анализируем. Но вот беда, а если мне надо протестировать две версии проекта. Тогда мне придётся компилировать эти две версии с этими изменениями. Не гуд, скажу я вам.

Очень муторно и неудобно. Мне то всего надо чуть чуть дописать, а ради этого перекомпиливать кучу всего.

У вот тут нам поможе ASM. Нет, не пугайтесь это не ассемблер, но очень близко. Это framework для анализа и изменения байт кода Java. Так вот с помощью этого «зверька» можно автоматически дописать в байт код всё что вам вздумаеться.

Давайте рассмотрим как с помощью ASM реализовать нашу идею. Всё очень просто.

  1. Качаем сам framework
  2. Качаем мануал по ASM с официального сайта. И, если вы хорошо знаете английский, читаете его и находите в нём ответ на данный вопрос.

Если вы хотите прочитать весь процесс реализации данного подхода к измерению времени работы метода на русском языке, то отпишите мне в коментах. Тогда я не поленюсь и распишу, что да как.

Источник: krolser.wordpress.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru