Как планировать выполнение задачи с периодическими интервалами?

Я пытался использовать некоторые коды для выполнения запланированной задачи и придумал эти коды.

import java.util.*; class Task extends TimerTask { int count = 1; // run is a abstract method that defines task performed at scheduled time. public void run() { System.out.println(count+" : Mahendra Singh"); count++; } } class TaskScheduling { public static void main(String[] args) { Timer timer = new Timer(); // Schedule to run after every 3 second(3000 millisecond) timer.schedule( new Task(), 3000); } } 

Мой выход:

 1 : Mahendra Singh 

Я ожидал, что компилятор напечатает серию Mahendra Singh с периодическим интервалом в 3 с, но, несмотря на ожидание около 15 минут, я получаю только один результат … Как это решить?

Использовать timer.scheduleAtFixedRate

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

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

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

Параметры:

  • задача – задача должна быть запланирована.
  • задержка – задержка в миллисекундах перед выполнением задачи.
  • период – в миллисекундах между очередными выполнениями задач.

Броски:

  • IllegalArgumentException – если задержка отрицательная или задержка + System.currentTimeMillis () отрицательна.
  • IllegalStateException – если задание уже было запланировано или отменено, таймер был отменен или тайм-stream завершен.

ScheduledExecutorService

Я хочу предложить вам альтернативу использованию таймера – ScheduledThreadPoolExecutor – реализацию интерфейса ScheduledExecutorService . Он имеет некоторые преимущества перед classом Timer (от «Java в параллелизме»):

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

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

И еще одна рекомендация, если вам нужно создать свой собственный сервис планирования, вы все равно сможете воспользоваться библиотекой, используя DelayQueue, реализацию BlockingQueue, которая обеспечивает функциональность планирования ScheduledThreadPoolExecutor. DelayQueue управляет коллекцией объектов Delayed. A Delayed имеет время задержки, связанное с ним: DelayQueue позволяет вам взять элемент только в том случае, если его время задержки истекло. Объекты возвращаются из параметра DelayQueue, упорядоченного по времени, связанному с их задержкой.

 public void schedule(TimerTask task,long delay) 

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

вы хотите:

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

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

Кварцевый планировщик также является решением, и, во-первых, вы выполняете class Quartz Job.

Кварцевое задание определяется тем, что вы хотите запустить

 package com.blogspot.geekonjava.quartz; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; public class QuartzJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { JobKey jobKey = context.getJobDetail().getKey(); System.out.println("Quartz" + "Job Key " + jobKey); } } 

Теперь вам нужно сделать Quartz Trigger

Существует два типа триггеров в кварце

SimpleTrigger – позволяет установить время начала, время окончания, интервал повтора.

 Trigger trigger = newTrigger().withIdentity("TriggerName", "Group1") .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10).repeatForever()).build(); 

CronTriggerразрешает выражение Unix cron указывать даты и время для запуска вашей работы.

 Trigger trigger = newTrigger() .withIdentity("TriggerName", "Group2") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build(); 

Класс Планировщик соединяет и Job, и Trigger вместе и выполняет его.

 Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); 

Полный пример вы можете увидеть здесь

 timer.scheduleAtFixedRate( new Task(), 1000,3000); 

Для этого у Java есть Timer и TimerTask class, но что это?

  • java.util.Timer – это class утилиты, который может использоваться для планирования streamа, который будет выполняться в определенное время в будущем. Класс Java Timer может использоваться для планирования задачи, которая должна выполняться один раз или запускаться через равные промежутки времени.
  • java.util.TimerTask – абстрактный class, который реализует интерфейс Runnable, и нам нужно расширить этот class, чтобы создать собственный TimerTask, который может быть запланирован с использованием classа таймера java.

Вы можете проверить полный учебник от GeekonJava

 TimerTask timerTask = new MyTimerTask(); //running timer task as daemon thread Timer timer = new Timer(true); timer.scheduleAtFixedRate(timerTask, 0, 10*1000); 
  • Как вычислить прошедшее время события в java?
  • Давайте будем гением компьютера.