11 Stimmen

Wenn eine Java TimerTask in einem Timer geplant wird, ist sie dann bereits "in Ausführung"?

Ich möchte gerne etwas über TimerTask klären. Wenn Sie den Code unten haben:

timer.schedule(task, 60000);

wenn die Aufgabe in der nächsten 1 Minute ausgeführt werden soll, wird das Aufgabenobjekt bereits ausgeführt?

weil ich irgendwo in meinem Code task.cancel() aufgerufen habe, aber es scheint, dass der Aufruf nicht verhindert, dass

auszuführende Aufgabe. Ich habe sogar den Rückgabewert des Aufrufs protokolliert und er gibt false zurück.

Ich bin auf meine Frage gekommen, als ich die Dokumentation für die Methode cancel gelesen habe:

Bricht die Aufgabe TimerTask ab und entfernt sie aus der Warteschlange des Timers. Im Allgemeinen wird false zurückgegeben, wenn der Aufruf nicht verhindert hat, dass eine TimerTask nicht mindestens einmal an der Ausführung gehindert hat. Nachfolgende Aufrufe haben keine Wirkung. Gibt true zurück, wenn der Aufruf eine geplante Ausführung verhindert hat, andernfalls false.

Ich glaube, ich habe cancel() vor der 1-minütigen Verzögerung aufgerufen. Aber wie kommt es, dass cancel false zurückgegeben hat,

wird sie [Aufgabe] bereits ausgeführt?

Ich hoffe, Sie können mir Hinweise/Hinweise oder sogar eine Erklärung dafür geben. Danke SO!

20voto

tolitius Punkte 21349
  • wenn die Aufgabe in der nächsten 1 Minute ausgeführt werden soll, das Aufgabenobjekt bereits ausgeführt wird

Nein, es wird die laufen. Methode dieser Aufgabe in genau 60 Sekunden. Wenn task.cancel() gibt zurück. false könnte das 3 Dinge bedeuten:

  • die Aufgabe wurde für eine einmalige Ausführung eingeplant und ist bereits gelaufen ODER
  • die Aufgabe wurde nie geplant ODER
  • die Aufgabe bereits abgebrochen wurde ODER

Wenn Sie also sicher sind, dass Sie die cancel vor 60 Sekunden nach dem Planen der Aufgabe, könnten Sie sie entweder mehrmals aufrufen und ein Ergebnis von einer nachfolgenden cancel ODER Sie rufen Abbrechen für eine andere Aufgabe auf.


Im Allgemeinen würde ich von folgenden Maßnahmen abraten Zeitschaltuhr zu Gunsten eines ScheduledExecutorService

Sie können eine gewünschte Funktionalität mit erreichen:

ScheduledExecutorService.schedule( callable, delay, timeunit )

Die Gründe, warum der ScheduledExecutorService der bevorzugte Weg ist, werden im Folgenden dargelegt aquí :

  • Timer kann empfindlich auf Änderungen der Systemuhr reagieren, ScheduledThreadPoolExecutor nicht

  • Der Zeitgeber hat nur einen Ausführungsthread, so dass eine lang laufende Aufgabe andere Aufgaben verzögern kann. ScheduledThreadPoolExecutor kann mit einer beliebigen Anzahl von Threads konfiguriert werden. Darüber hinaus haben Sie die volle Kontrolle über die erstellten Threads, wenn Sie dies wünschen (durch Bereitstellung der ThreadFactory)

  • Laufzeitausnahmen, die in TimerTask ausgelöst werden, töten diesen einen Thread und machen damit Timer tot :-( ... d.h. geplante Aufgaben werden nicht mehr ausgeführt. ScheduledThreadExecutor fängt nicht nur Laufzeitausnahmen ab, sondern lässt Sie diese auch behandeln, wenn Sie wollen (indem Sie die Methode afterExecute von ThreadPoolExecutor überschreiben). Die Aufgabe, die die Ausnahme ausgelöst hat, wird abgebrochen, aber die anderen Aufgaben werden weiter ausgeführt.

4voto

wannik Punkte 11760

Ich weiß nicht, warum Ihr Code das Ergebnis false .

Der folgende Code druckt true .

import java.util.Timer;
import java.util.TimerTask;

public class Test {
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {

            @Override
            public void run() {
                System.out.println("hi");
            }

        };
        timer.schedule(task, 60000);
        System.out.println(task.cancel());
    }
}

Wenn die letzte println kommentiert wird, gibt das Programm hi .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X