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


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

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 минут, я получаю только один выход...Как мне решить эту проблему?

6 71

6 ответов:

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

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

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

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

параметры:

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

Броски:

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

ScheduledExecutorService

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

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

еще одна проблема с таймером заключается в том, что он ведет себя плохо, если a TimerTask создает непроверенное исключение. Поток таймера не ловит исключение, поэтому непроверенное исключение, вызванное из TimerTask, завершает поток таймера. Таймер также не воскрешает поток в этой ситуации; вместо этого он ошибочно предполагает, что весь таймер был отменен. В этом случае таймерные задачи, которые уже запланированы, но еще не выполнены, никогда не выполняются, а новые задачи не могут быть запланированы. (Эта проблема называется "утечка резьбы").

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

public void schedule(TimerTask task,long delay)

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

вы хотите:

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

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

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

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

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 есть два типа триггеров

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();

класс планировщика связывает оба задание и триггер вместе и выполнить его.

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

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

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

для этого Java имеет класс Timer и TimerTask, но что это такое ?

  • java.утиль.Таймер это служебный класс, который можно использовать для планирования поток, который будет выполняться в определенное время в будущем. Класс таймера Java может используется для планирования однократного выполнения задачи или выполнения в обычном режиме интервалы.
  • java.утиль.TimerTask - это абстрактный класс, который реализует Интерфейс Runnable и нам нужно расширить этот класс, чтобы создать наш собственный TimerTask, который можно запланировать с помощью класса таймера java.

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

TimerTask timerTask = new MyTimerTask();

//running timer task as daemon thread

Timer timer = new Timer(true);

timer.scheduleAtFixedRate(timerTask, 0, 10*1000);