Jak zaplanować zadanie do wykonania w regularnych odstępach czasu?

Próbowałem kilku kodów do realizacji zaplanowanego zadania i wymyśliłem te kody .

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

Moje wyjście:

1  :  Mahendra Singh

Spodziewałem się, że kompilator wydrukuje serię Mahendry Singha w okresowym odstępie 3 s, ale pomimo oczekiwania około 15 minut, otrzymuję tylko jedno wyjście...Jak mam to rozwiązać?

Author: Valentin Rocher, 2010-12-28

6 answers

Użycie timer.scheduleAtFixedRate

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

Rozkłada określone zadanie do powtarzalnego wykonania o stałej szybkości, zaczynając po określonym opóźnieniu. Kolejne egzekucje odbywają się w przybliżeniu w regularnych odstępach czasu, oddzielonych określonym okresem.
W przypadku realizacji o stałym oprocentowaniu każda realizacja jest zaplanowana w stosunku do zaplanowanego czasu realizacji początkowej. Jeśli wykonanie jest opóźnione z jakiegokolwiek powodu (np. usuwanie śmieci lub inne działania w tle), dwa lub więcej egzekucje będą następować w szybkim tempie, aby " nadrobić zaległości."W dłuższej perspektywie częstotliwość wykonania będzie dokładnie odwrotnością określonego okresu (zakładając, że zegar systemowy jest obiektem bazowym.wait (long) jest dokładne).

Wykonywanie stałych stawek jest odpowiednie dla powtarzających się czynności, które są wrażliwe na Czas absolutny, takich jak dzwonienie co godzinę w godzinę lub wykonywanie zaplanowanych prac konserwacyjnych każdego dnia o określonej porze. Jest to również odpowiednie dla powtarzających się działań gdzie całkowity czas wykonania określonej liczby egzekucji jest ważny, na przykład licznik, który tyka raz na sekundę przez dziesięć sekund. Wreszcie, wykonanie o stałej szybkości jest odpowiednie do planowania wielu powtarzających się zadań czasowych, które muszą pozostać zsynchronizowane względem siebie.

Parametry:

  • zadanie-zadanie do zaplanowania.
  • delay-opóźnienie w milisekundach przed wykonaniem zadania.
  • period-czas w milisekundach pomiędzy kolejne realizacje zadań.

Rzut:

  • IllegalArgumentException-jeśli opóźnienie jest ujemne, lub delay + System.currentTimeMillis() jest ujemna.
  • IllegalStateException - jeśli zadanie było już zaplanowane lub anulowane, timer został anulowany lub wątek timera został zakończony.
 64
Author: st0le,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-18 01:35:26

ScheduledExecutorService

Chciałbym zaoferować alternatywę dla timera używającego - ScheduledThreadPoolExecutor, implementacji interfejsu ScheduledExecutorService. Ma pewne zalety nad klasą Timer (od "Java in Concurrency"):

Timer tworzy tylko jeden wątek do wykonywania zadań timera. Jeśli zadanie timera trwa zbyt długo, dokładność pomiaru czasu innych zadań może ucierpieć. Jeśli cykliczna Maska czasowa ma być uruchamiana co 10 ms i kolejne zadanie czasowe zajmuje 40 ms, powtarzające się zadanie (w zależności od tego, czy było zaplanowane ze stałą prędkością, czy ze stałym opóźnieniem) jest wywoływane cztery razy z rzędu po zakończeniu długotrwałego zadania lub "pomija" całkowicie cztery wywołania. Zaplanowane pule wątków rozwiązują to ograniczenie, umożliwiając dostarczanie wielu wątków do wykonywania zadań odroczonych i okresowych.

Innym problemem z timerem jest to, że zachowuje się źle, jeśli TimerTask rzuca niezaznaczone wyjątek. Wątek timera nie wychwytuje wyjątku, więc niezaznaczony wyjątek wyrzucony z maski TimerTask kończy wątek timera. Timer również nie wskrzesza wątku w tej sytuacji; zamiast tego błędnie zakłada, że cały Timer został anulowany. W takim przypadku zadania czasowe, które są już zaplanowane, ale nie zostały jeszcze wykonane, nigdy nie są uruchamiane, a nowe zadania nie mogą być zaplanowane. (Ten problem, zwany "wyciekiem wątku").

I kolejna rekomendacja, jeśli potrzebujesz zbudować własną usługa planowania, nadal możesz korzystać z biblioteki za pomocą DelayQueue, implementacji BlockingQueue, która zapewnia funkcjonalność planowania ScheduledThreadPoolExecutor. DelayQueue zarządza kolekcją opóźnionych obiektów. Opóźniony ma związany z nim czas opóźnienia: DelayQueue pozwala wziąć element tylko wtedy, gdy jego opóźnienie wygasło. Obiekty są zwracane z opóźnieniem uporządkowanym o czas związany z ich opóźnieniem.

 68
Author: Alexandr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-20 06:26:15
public void schedule(TimerTask task,long delay)

Planuje wykonanie określonego zadania po określonym opóźnieniu.

Chcesz:

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

Rozkłada określone zadanie na powtarzające się stałe opóźnienie, rozpoczynające się po określonym opóźnieniu. Kolejne egzekucje odbywają się w przybliżeniu w regularnych odstępach czasu, oddzielonych określonym okresem.

 14
Author: yurib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 04:05:35

Quartz scheduler jest również rozwiązaniem i najpierw tworzysz Quartz Job class.

Quartz job jest zdefiniowany co chcesz uruchomić

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

Teraz musisz zrobić Kwarcowy WYZWALACZ

Istnieją dwa rodzaje wyzwalaczy w kwarcu

SimpleTrigger - pozwala ustawić czas rozpoczęcia, Czas zakończenia, interwał powtórzeń.

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

CronTrigger - pozwala Uniksowemu wyrażeniu cron określać daty i czasy, aby uruchomić swój praca.

Trigger trigger = newTrigger()
                .withIdentity("TriggerName", "Group2")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();
Klasa Scheduler łączy oba zadania Jobi Trigger razem i wykonuje je.
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);

Pełny przykład można zobaczyć tutaj

 4
Author: GeekOnJava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-26 06:34:23
timer.scheduleAtFixedRate( new Task(), 1000,3000); 
 2
Author: Brijesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-09 13:35:02

Do tego celu Java posiada klasę Timer i TimerTask, ale co to jest ?

  • java.util.Timer to klasa użytkowa, która może być użyta do zaplanowania wątek zostanie wykonany w określonym czasie w przyszłości. Klasa Java Timer może służy do zaplanowania zadania, które ma być uruchamiane jednorazowo lub regularnie interwały.
  • java.util.TimerTask jest klasą abstrakcyjną, która implementuje Runnable interface i musimy rozszerzyć tę klasę, aby stworzyć własną TimerTask, który może być zaplanowane przy użyciu klasy Java Timer.

Możesz sprawdzić cały tutorial z GeekonJava

TimerTask timerTask = new MyTimerTask();

//running timer task as daemon thread

Timer timer = new Timer(true);

timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
 1
Author: GeekOnJava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 09:54:01