2010-12-28 6 views
68

Ich habe einige Codes versucht, um eine geplante Aufgabe zu implementieren und kam mit diesen Codes.Wie plane ich eine Aufgabe, die in regelmäßigen Abständen ausgeführt wird?

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

Meine Ausgabe:

1 : Mahendra Singh 

ich den Compiler erwartete eine Reihe von Mahendra Singh in periodischem Intervall von 3 s zu drucken, aber für etwa 15 Minuten trotz warten, erhalte ich nur einen Ausgang ... Wie löse ich das aus?

+0

** Quartz Scheduler **, um Java-Anwendung zu scheduler einen Job/eine Aufgabe zu einem bestimmten Datum und Uhrzeit zu ermöglichen [überprüfen Sie das vollständige Beispiel] (http://geekonjava.blogspot.com/2015/05/how -to-Scheduling-Job-in-Java-via.html) – GeekOnJava

Antwort

58

Verwenden timer.scheduleAtFixedRate

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

Termine der angegebene Aufgabe für wiederholte festverzinslicher Ausführung, nach der angegebenen Verzögerung beginnen. Spätere Ausführungen erfolgen in ungefähr regelmäßigen Abständen, getrennt durch den angegebenen Zeitraum.
Bei Ausführung mit fester Rate wird jede Ausführung relativ zur geplanten Ausführungszeit der ursprünglichen Ausführung geplant. Wenn eine Ausführung aus irgendeinem Grund verzögert wird (z. B. bei der Speicherbereinigung oder anderen Hintergrundaktivitäten), werden zwei oder mehr Ausführungen in schneller Folge "aufholen". Auf lange Sicht ist die Ausführungshäufigkeit genau der Kehrwert der angegebenen Periode (vorausgesetzt, die Systemuhr, die Object.wait (long) zugrunde liegt, ist korrekt).

Die Ausführung mit fester Rate eignet sich für wiederkehrende Aktivitäten, die für die absolute Zeit empfindlich sind, z. B. einen Klingelton zu jeder vollen Stunde oder jeden Tag zu einem bestimmten Zeitpunkt eine geplante Wartung ausführen. Es ist auch für wiederkehrende Aktivitäten geeignet, bei denen die Gesamtzeit für die Durchführung einer festgelegten Anzahl von Ausführungen wichtig ist, wie z. B. ein Countdown-Timer, der zehn Sekunden lang einmal pro Sekunde tickt. Schließlich ist eine Ausführung mit fester Rate geeignet, um mehrere sich wiederholende Zeitgeberaufgaben zu planen, die in Bezug aufeinander synchronisiert bleiben müssen.

Parameter:

  • Aufgabe - Aufgabe geplant werden.
  • Verzögerung - Verzögerung in Millisekunden, bevor die Aufgabe ausgeführt werden soll.
  • Periode - Zeit in Millisekunden zwischen aufeinanderfolgenden Aufgabenausführungen.

Wirft:

  • Illegal - wenn Verzögerung negativ ist, oder eine Verzögerung + System.currentTimeMillis() ist negativ.
  • IllegalStateException - Wenn die Aufgabe bereits geplant oder abgebrochen wurde, wurde der Timer abgebrochen oder der Timer-Thread beendet.
+3

scheduleAtFixedRate adressiert sein Problem, die Ausgabe nur einmal zu erhalten, nicht. –

+0

@ JamesA.N.Stuffer, er braucht die Ausgabe wiederholt, nicht einmal. – st0le

+1

Ja, aber die Wiederholung wird einfach durch Hinzufügen eines dritten Arguments erreicht - eine Änderung der Methode ist nicht erforderlich. –

12
public void schedule(TimerTask task,long delay) 

Plant die angegebene Task zur Ausführung nach der angegebenen Verzögerung.

Sie wollen:

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

Spiel die angegebene Aufgabe für wiederholt fest Verzögerung Ausführung, nach der angegebenen Verzögerung beginnen. Spätere Ausführungen finden in ungefähr regelmäßigen Abständen statt, getrennt durch den angegebenen Zeitraum.

3

können Sie verwenden Quartz

+20

-1 Noch eine andere Bibliothek benötigt nur für eine grundlegende Aufgabe, die mit dem vorhandenen Framework getan werden kann. Ja Quarz kann mehr, aber es ist nicht hilfreich im Zusammenhang mit dieser Frage – JDC

+2

@JDC: Warum erfinden Sie das Rad neu! –

+0

Ich stimme den obigen Kommentaren zu, aber ich würde sagen, das wäre immer noch eine gute Antwort, wenn es ein Beispiel gibt. SO Regeln sagen, ein Link ist keine Antwort. Dies sollte ein Kommentar sein. –

65

ScheduledExecutorService

Ich wünsche Ihnen eine Alternative zu den Timer bieten mit - ScheduledThreadPoolExecutor, eine Implementierung der ScheduledExecutorService Schnittstelle. Es hat einige Vorteile gegenüber der Timer-Klasse (aus "Java in Concurrency"):

Ein Timer erstellt nur einen einzigen Thread zum Ausführen von Timer-Aufgaben. Wenn eine Timer-Task zu lange dauert, kann die Timing-Genauigkeit anderer TimerTasks leiden. Wenn eine wiederkehrende TimerTask alle 10 ms ausgeführt wird und eine andere Timer-Task 40 ms benötigt, wird die wiederkehrende Task (abhängig davon, ob sie mit fester oder fester Verzögerung geplant wurde) viermal in schneller Folge nach der langen aufgerufen -Running-Task beendet oder "vermisst" vier Aufrufe vollständig. Geplante Threadpools berücksichtigen diese Einschränkung, indem Sie mehrere Threads zum Ausführen von zurückgestellten und periodischen Tasks bereitstellen können.

Ein anderes Problem mit Timer ist, dass es sich schlecht verhält, wenn eine TimerTask eine ungeprüfte Ausnahme auslöst. Der Timer-Thread fängt die Ausnahme nicht ab, sodass eine ungeprüfte Ausnahme, die von einer TimerTask ausgelöst wird, den Timer-Thread beendet. Der Timer lässt den Thread in dieser Situation auch nicht wieder auferstehen. Stattdessen wird fälschlicherweise davon ausgegangen, dass der gesamte Timer abgebrochen wurde. In diesem Fall werden TimerTasks, die bereits geplant, aber noch nicht ausgeführt wurden, nie ausgeführt, und neue Aufgaben können nicht geplant werden. (Dieses Problem wird als "Thread Leakage" bezeichnet).

Und eine weitere Empfehlung, wenn Sie Ihren eigenen Zeitplanungsdienst erstellen müssen, können Sie möglicherweise noch die Bibliothek nutzen, indem Sie eine DelayQueue verwenden, eine BlockingQueue-Implementierung, die die Planungsfunktion von ScheduledThreadPoolExecutor bietet. Eine DelayQueue verwaltet eine Sammlung von verzögerten Objekten. A Delayed hat eine damit verbundene Verzögerungszeit: Mit DelayQueue können Sie ein Element nur dann übernehmen, wenn seine Verzögerung abgelaufen ist. Objekte werden von einer DelayQueue zurückgegeben, die nach der Zeit angeordnet ist, die mit ihrer Verzögerung verknüpft ist.

+2

Ein weiteres Problem mit dem Zeitgeber ist, dass beim Ändern der Systemuhr der Zeitgeber gestört wird – rajath

0

Zu diesem Zweck Java hat Timer und TimerTask Klasse, aber was ist das?

  • java.util.Timer ist eine Utility-Klasse, die verwendet werden kann, einen Thread planen zu bestimmten Zeit in der Zukunft ausgeführt werden. Die Java-Timer-Klasse kann verwendet werden, um eine Task zu planen, die einmalig ausgeführt oder in regelmäßigen Intervallen von ausgeführt werden soll.
  • java.util.TimerTask ist eine abstrakte Klasse, die Runnable-Schnittstelle implementiert, und wir müssen diese Klasse erweitern unsere eigene Timertask zu erstellen, die Java-Timer-Klasse geplant werden kann.

können Sie vollständige Tutorial check von GeekonJava

TimerTask timerTask = new MyTimerTask(); 

//running timer task as daemon thread 

Timer timer = new Timer(true); 

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

Quartz Scheduler ist auch eine Lösung und zunächst Sie Quartz Job Klasse.

Quartz Job definiert ist, was Sie Sie

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

Jetzt Quarz-Trigger

Es gibt zwei Arten von Triggern in Quarz

SimpleTrigger machen müssen ausgeführt werden soll - Erlaubt Startzeit, Endzeit, Wiederholungsintervall einzustellen.

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

CronTrigger - Ermöglicht Unix Cron-Ausdruck die Daten und Zeiten geben Sie Ihre Job ausgeführt werden soll.

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

Scheduler Klasse Links beide Job und Trigger- zusammen und ausführen.

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

Full Example you can see here

1

timer.scheduleAtFixedRate (neue Aufgabe(), 1000,3000);

Verwandte Themen