7 Stimmen

Java: Timer und der von ihm erstellte Thread

Ich habe diese Frage:

Ich habe einen Timer. Mit scheduleAtFixedRate erstellt er eine neue Timer-Aufgabe. In dieser Timer-Aufgabe befindet sich bestimmter Code, der möglicherweise einige Zeit in Anspruch nimmt, um abgeschlossen zu werden. Wie kann ich sicherstellen, dass der Timer keine neue Aufgabe erstellt, wenn die vorherige noch nicht abgeschlossen ist?

Vielen Dank

19voto

skaffman Punkte 389758

Meine Antwort wäre, Timer nicht zu verwenden, da er veraltet ist. Seit Java5 wurde Timer durch den ScheduledExecutorService ersetzt, der flexibler und einfacher zu verwenden ist. Sie haben feinere Kontrolle darüber, wie der Scheduler funktioniert, eine Kontrolle, die Sie mit Timer nicht haben.

Sie erstellen einen mit der Factory-Klasse Executors, die über verschiedene Factory-Methoden verfügt. Die, auf die Sie schauen sollten, ist newSingleThreadScheduledExecutor, der genau das tun sollte, was Sie suchen:

Erstellt einen Executor mit einem einzigen Thread, der Befehle planen kann, um nach einer angegebenen Verzögerung auszuführen oder periodisch auszuführen. Aufgaben sind garantiert, dass sie sequenziell ausgeführt werden und nie mehr als eine Aufgabe aktiv sein wird zu einem gegebenen Zeitpunkt.

Mit einem ScheduledExecutorService, anstatt TimerTask zu unterklassen, unterklassieren Sie Runnable direkt und reichen dann die Aufgabe beim Executor ein. Es gibt verschiedene Methoden auf dem Executor, Sie müssen auswählen, welche für Ihre Bedürfnisse geeignet ist (lesen Sie die javadoc für ScheduledExecutorService sorgfältig durch), aber im Wesentlichen geht es so:

    // Initialisieren des Executors
    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

    while (tasksRemaining) {
        // Erstellen Sie Ihre Aufgabe
        Runnable task = ....;
        // Reichen Sie es beim Executor ein, indem Sie eine der verschiedenen scheduleXYZ-Methoden verwenden
        executor.schedule(task, delay, unit);
    }

    // Wenn alles fertig ist, den Executor herunterfahren
    executor.shutdown();

Wie immer, lesen Sie die javadoc.

5voto

Brian Agnew Punkte 260470

Das Dokument für die Timer-Klasse

Zu jedem Timer-Objekt gehört ein einzelner Hintergrundthread, der verwendet wird, um alle Aufgaben des Timers sequenziell auszuführen. Timer-Aufgaben sollten schnell abgeschlossen werden. Wenn eine Timer-Aufgabe zu lange dauert, "blockiert" sie den Ausführungsthread des Timers. Dies kann wiederum die Ausführung nachfolgender Aufgaben verzögern, die sich dann möglicherweise ansammeln und schnell hintereinander ausgeführt werden, wenn und falls die problematische Aufgabe schließlich abgeschlossen ist.

deutet darauf hin, dass es nur einen Hintergrundthread gibt. Daher glaube ich, dass dieses Szenario nicht eintreten wird.

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