2010-02-15 13 views

Antwort

19

Timer des documentation sagt der folgende:

Timer Aufgaben schnell abschließen sollte. Wenn eine Zeitgeberaufgabe übermäßig lange dauert, "verschlingt" sie den Aufgabenausführungsthread des Zeitgebers. Dies kann wiederum die Ausführung nachfolgender Tasks verzögern, die sich schnell zusammenziehen und ausführen können, wenn (und falls) die fehlerhafte Task schließlich abgeschlossen wird.

Das heißt, gleichzeitige TimerTask Threads werden nicht ausgeführt. Die Aufgaben werden in einer Warteschlange gesammelt. Dies kann oder kann nicht angemessen sein (wahrscheinlicher nicht).

+7

Ich mag die Art, wie Sie beschreiben "Die Aufgaben werden in einer Warteschlange ansammeln." Definitiv besser als die Dokumentation als "Schweine" und "Bunch up" beschreiben. Vor allem für diejenigen, die schlechte Englisch xD – GMsoF

15

Timer und TimerTask nicht gut mit dieser Art von Situation umgehen. Wenn Sie besser damit umgehen wollen, dann verwenden Sie diese Klassen nicht.

java.util.concurrent.ScheduledExecutorService bietet zwei Zeitplanungsmethoden, scheduleAtFixedRate und scheduledWithFixedDelay, die regeln, was passiert, wenn Aufgaben "bündeln".

scheduleAtFixedRate:

erstellt und führt eine periodische Aktion , die zuerst nach der gegebenen Anfangsverzögerung und anschließend mit der gegebenen Periode aktiviert werden; das ist Ausführungen beginnen nach initialDelay dann initialDelay + Zeitraum, dann initialDelay + 2 * Zeitraum, und so auf. Wenn bei einer Ausführung der Task eine Exception auftritt, werden nachfolgende Ausführungen unterdrückt. Andernfalls wird die Aufgabe nur über Kündigung oder Beendigung des Executors beendet. Wenn eine Ausführung dieser Task länger dauert als ihre Periode, , dann können nachfolgende Ausführungen möglicherweise spät beginnen, werden aber nicht gleichzeitig ausgeführt.

scheduleWithFixedDelay:

erstellt und führt eine periodische Aktion , die zuerst nach der gegebenen Anfangsverzögerung und anschließend mit der gegebenen Verzögerung zwischen der Beendigung einer Ausführung und dem Beginn aktiviert werden von der nächsten. Wenn eine Ausführung der Task auf eine Ausnahme stößt, werden nachfolgende Ausführungen unterdrückt. Andernfalls wird die Aufgabe nur durch Kündigung oder Beendigung des Executors beendet.

Sie können ScheduledExecutorService Instanzen mit der Fabrikklasse Executors erstellen.

+0

Vielen Dank für die Beantwortung einer Lösung sowie –

+2

Wie ist 'ScheduleAtFixedRate' besser als' Timer' und 'TimerTask'? Beide stellen sicher, dass die Dinge in festen Intervallen passieren, und wenn das Intervall zur nächsten Ausführung übergeht, wird die Ausführung in die Warteschlange gestellt. – SexyBeast

Verwandte Themen