Eine bessere Möglichkeit, Code für einen bestimmten Zeitraum auszuführen

8

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%     
mhollander38 09.02.2011, 21:53
quelle

4 Antworten

16

Wenn Sie Java5 oder höher verwenden, sollten Sie ScheduledThreadPoolExecutor und 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, und Timer 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 anderer Timer s leiden. Wenn eine wiederkehrende TimerTask alle 10 ms ausgeführt wird und eine weitere TimerTask 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 ein Timer eine ungeprüfte Ausnahme auslöst. Der Thread TimerTask fängt die Ausnahme nicht ab, sodass eine nicht geprüfte Ausnahme, die von Timer ausgelöst wird, den Timer-Thread beendet. TimerTask hebt den Thread in dieser Situation ebenfalls nicht auf. Stattdessen wird fälschlicherweise angenommen, dass die gesamte Timer gelöscht wurde. In diesem Fall werden Timer 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).

Aktualisieren

Wenn Ihnen das oben Genannte nicht gefällt, können Sie die Task wie unten beschrieben eine eigene Ausführungszeit messen lassen:

%Vor%     
Péter Török 09.02.2011, 22:02
quelle
3
  

[...] 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).

    
aioobe 09.02.2011 21:57
quelle
0

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.

    
biziclop 09.02.2011 22:01
quelle
0

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%     
MrJacqes 09.02.2011 22:21
quelle

Tags und Links