Ich muss Code für eine vordefinierte Zeit ausführen, wenn die Zeit abgelaufen ist, muss er anhalten. Derzeit benutze ich eine TimerTask, um den Code für eine bestimmte Zeit ausführen zu lassen, aber das verursacht endlose Threads, die vom Code erzeugt werden und ist einfach nicht effizient. Gibt es eine bessere Alternative?
Aktueller Code;
%Vor% Wenn Sie Java5 oder höher verwenden, sollten Sie ScheduledThreadPoolExecutor
Future
. Mit ersterem können Sie Aufgaben planen, die nach einer bestimmten Verzögerung oder in bestimmten Intervallen ausgeführt werden, sodass sie die Rolle von Timer
nur zuverlässiger übernehmen.
Die Funktion
Timer
verwaltet die Ausführung von verzögerten ("Führen Sie diese Aufgabe in 100 ms") und periodischen ("Führen Sie diese Aufgabe alle 10 ms") Aufgaben. % Co_de% hat jedoch einige Nachteile, undTimer
sollte als Ersatz angesehen werden. [...]A
ScheduledThreadPoolExecutor
erzeugt nur einen einzigen Thread zum Ausführen von Timer-Tasks. Wenn eine Zeitgeberaufgabe zu lange dauert, kann die Zeitgenauigkeit andererTimer
s leiden. Wenn eine wiederkehrendeTimerTask
alle 10 ms ausgeführt wird und eine weitereTimerTask
40 ms benötigt, wird die wiederkehrende Aufgabe (abhängig davon, ob sie mit fester Rate oder fester Verzögerung geplant wurde) viermal in schneller Folge aufgerufen Die lang andauernde Aufgabe schließt vier Aufrufe vollständig ab oder "verfehlt" sie vollständig. Geplante Thread-Pools berücksichtigen diese Einschränkung, indem Sie mehrere Threads zum Ausführen von verzögerten und periodischen Aufgaben bereitstellen können.Ein weiteres Problem mit
TimerTask
ist, dass es sich schlecht verhält, wenn einTimer
eine ungeprüfte Ausnahme auslöst. Der ThreadTimerTask
fängt die Ausnahme nicht ab, sodass eine nicht geprüfte Ausnahme, die vonTimer
ausgelöst wird, den Timer-Thread beendet.TimerTask
hebt den Thread in dieser Situation ebenfalls nicht auf. Stattdessen wird fälschlicherweise angenommen, dass die gesamteTimer
gelöscht wurde. In diesem Fall werdenTimer
s, die bereits geplant, aber noch nicht ausgeführt wurden, nie ausgeführt, und neue Aufgaben können nicht geplant werden.
Aus Java-Parallelität in der Praxis , Abschnitt 6.2.5.
Und TimerTask
s kann so eingeschränkt werden, dass höchstens für die angegebene Zeit ausgeführt wird (ein Future
wird geworfen, wenn es nicht rechtzeitig beendet werden konnte).
Wenn Ihnen das oben Genannte nicht gefällt, können Sie die Task wie unten beschrieben eine eigene Ausführungszeit messen lassen:
%Vor%[...] Zurzeit verwende ich eine TimerTask, um den Code für eine bestimmte Zeit ausführen zu lassen [...]
Die Timer-Aufgabe wird niemals die aktuell laufende Aufgabe stoppen. In der Tat ist es nur Zweck, die Aufgabe immer wieder neu zu starten.
Es gibt keinen einfachen Weg, dies ohne eine enge Zusammenarbeit mit der ausführenden Aufgabe zu lösen. Der beste Weg besteht darin, die Aufgabe selbst überwachen zu lassen und sicherzustellen, dass sie nach Ablauf der Zeit zurückkehrt (beendet).
Wenn du meinst, dass das Programm beendet werden muss, ist die Lösung, einen Thread für deine Verarbeitung zu erstellen und ihn als Daemon zu markieren, ihn zu starten und im Hauptthread für die benötigte Zeit zu schlafen und dann einfach von% co_de zurückzukehren % Methode.
Scratch, dass wenn Sie aufhören, Sie nur die Verarbeitung zu stoppen.
Es sollte auch beachtet werden, dass Sie im Allgemeinen nur einen Timer () erstellen müssen. Aus dem Codeausschnitt würde ich erraten, dass Sie mehrere Timer () -Objekte erstellen.
Die Zeit in der Zeitplanmethode ist die Zeit, in der ausgeführt werden soll, nicht die Ausführungsdauer.
Stellen Sie eine Startzeit vor die for-Schleife & amp; eine Pause in der for-Schleife machen, wenn Sie das Zeitlimit überschritten haben.
%Vor%