Java Timer vs ExecutorService?
-
03-07-2019 - |
Frage
Ich habe Code, wo ich eine Aufgabe planen java.util.timer
verwenden. Ich war auf der Suche um und sah ExecutorService
das gleiche tun. Also diese Frage ist hier, haben Sie verwendet Timer und ExecutorService
Aufgaben zu planen, was ist der Nutzen voneinander mit über?
wollte auch überprüfen, ob jemand die Timer
Klasse benutzt hatte, und lief in allen Fragen, die die ExecutorService
für sie gelöst werden.
Lösung
Nach Java Concurrency in Practice :
-
Timer
auf Änderungen in dem Systemtakt empfindlich sein kann,ScheduledThreadPoolExecutor
nicht. -
Timer
hat nur einen Ausführungs-Thread, so lang andauernde Aufgabe andere Aufgaben verzögern.ScheduledThreadPoolExecutor
kann mit einer beliebigen Anzahl von Threads konfiguriert werden. Darüber hinaus haben Sie die volle Kontrolle über Threads erstellt, wenn Sie (indemThreadFactory
) wollen. - Runtime Ausnahmen in
TimerTask
geworfen töten, dass ein Thread, wodurchTimer
tot :-( ... dh geplante Tasks nicht mehr ausgeführt werden.ScheduledThreadExecutor
nicht nur fängt Laufzeit Ausnahmen, aber es lässt Sie mit ihnen umgehen, wenn Sie (wollen durch zwingendeafterExecute
Methode vonThreadPoolExecutor
). Aufgabe, die Ausnahme ausgelöst hat wird abgebrochen, aber auch andere Aufgaben werden weiterhin ausgeführt.
Wenn Sie ScheduledThreadExecutor
statt Timer
verwenden können, tun dies.
Eine weitere Sache ... während ScheduledThreadExecutor
in Java 1.4-Bibliothek nicht verfügbar ist, gibt es ein Backport von JSR 166 (java.util.concurrent
) auf Java 1.2, 1.3, 1.4 , die die ScheduledThreadExecutor
Klasse hat.
Andere Tipps
Wenn es Ihnen zur Verfügung ist, dann ist es schwierig, aus einem Grund zu glauben, nicht auf der Testamentsvollstrecker Rahmen Java 5 zu verwenden. Berufung:
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
gibt Ihnen ein ScheduledExecutorService
mit ähnlicher Funktionalität Timer
(das heißt es wird single-threaded), aber dessen Zugangs kann leicht besser skalierbar sein (unter der Haube, verwendet es gleichzeitig Strukturen anstatt vollständige Synchronisation wie bei der Timer
Klasse). auch eine ScheduledExecutorService
Mit gibt Ihnen Vorteile wie:
- Sie können es wenn nötig (die
newScheduledThreadPoolExecutor()
oder dieScheduledThreadPoolExecutor
-Klasse) - Die 'one off' Ausführungen kann zurückgehen
Über die einzigen Gründe für Timer
kleben ich denken kann, sind:
- Sie ist vor Java 5
- Eine ähnliche Klasse in J2ME vorgesehen ist, die Ihre Anwendung Portierung könnte einfacher (aber es wäre nicht sehr schwierig sein, eine gemeinsame Abstraktionsschicht in diesem Fall hinzufügen)
ExecutorService ist neuer und allgemeiner. Ein Timer ist nur ein Thread, der in regelmäßigen Abständen Zeug läuft sie es geplant haben.
Ein ExecutorService ein Thread-Pool sein kann, oder auch über andere Systeme in einem Cluster verteilt und Dinge tun, wie einmalige Batch-Ausführung, etc ...
Schauen Sie sich nur die einzelnen Angebote, was zu entscheiden.
Hier einige weitere gute Praktiken rund um Timer Verwendung:
http://tech.puredanger.com/2008/09/22 / Timer-Regeln /
Im Allgemeinen ich Timer verwenden würde für schnelle und schmutzige Sachen und Executor für robustere Nutzung.
Mein Grund für manchmal lieber Timer über Executors.newSingleThreadScheduledExecutor () ist, dass ich viel sauberen Code, wenn ich den Timer muß auf Daemon-Threads auszuführen.
vergleichen
private final ThreadFactory threadFactory = new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
};
private final ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor(threadFactory);
mit
private final Timer timer = new Timer(true);
Ich tue dies, wenn ich die Robustheit eines ExecutorService nicht brauchen.
Von der Oracle-Dokumentation Seite auf ScheduledThreadPoolExecutor
A ThreadPoolExecutor Das kann zusätzlich Zeitplan Befehle nach einer gegebenen Verzögerung auszuführen, oder periodisch auszuführen. Diese Klasse ist vorzuziehen Timer , wenn mehrere Arbeitsthreads benötigt werden, oder wenn die zusätzliche Flexibilität oder Fähigkeiten von ThreadPoolExecutor (was diese Klasse erweitert) erforderlich sind.
ExecutorService/ThreadPoolExecutor
oder ScheduledThreadPoolExecutor
ist offensichtliche Wahl, wenn Sie mehrere Worker-Threads haben.
Pros von ExecutorService
über Timer
-
Timer
kann nicht die Vorteile der verfügbaren CPU-Kerne im Gegensatz zuExecutorService
nehmen vor allem mit mehreren Aufgaben Aromen vonExecutorService
wie ForkJoinPool -
ExecutorService
bietet kollaborative API, wenn Sie die Koordination zwischen mehreren Aufgaben benötigen. Angenommen, Sie N Anzahl von Arbeitsaufgaben vorlegen müssen und für die Durchführung aller von ihnen warten. Sie können es leicht erreichen mit invokeAll API. Wenn Sie das gleiche mit mehrerenTimer
Aufgaben erreichen wollen, wäre es nicht einfach sein. -
ThreadPoolExecutor für das Management von Themen-Lebenszyklus besser API zur Verfügung stellt.
Thread-Pools adressieren zwei unterschiedliche Probleme: sie in der Regel eine verbesserte Leistung bieten, wenn eine große Anzahl von asynchronen Aufgaben ausführt, aufgrund der reduzierten pro-Aufgabe Aufruf Gemeinkosten, und sie bieten ein Mittel zur Begrenzungs und die Verwaltung von Ressourcen, einschließlich Fäden, verbraucht bei der Ausführung eine Sammlung von Aufgaben. Jeder ThreadPoolExecutor unterhält auch einige grundlegenden Statistiken, wie zum Beispiel der Anzahl der erledigten Aufgaben
Ein paar Vorteile:
a. Sie können erstellen / Verwaltung / Steuerung Lebenszyklus von Threads und Thread-Erzeugung Kostenaufwand optimieren
b. Sie können die Verarbeitung von Aufgaben steuern (Work Stealing, ForkJoinPool, invokeAll) etc.
c. Sie können den Fortschritt und die Gesundheit der Threads
überwachend. Bietet eine bessere Ausnahmebehandlung