Ich habe Code, mit dem ich eine Aufgabe mit plane java.util.Timer
. Ich habe mich umgesehen und gesehen, dass ExecutorService
ich das Gleiche tun kann. Also, diese Frage hier, haben Sie Aufgaben verwendet Timer
und ExecutorService
geplant, was ist der Vorteil einer Verwendung gegenüber einer anderen?
Wollte auch überprüfen, ob jemand die Timer
Klasse benutzt hatte und auf irgendwelche Probleme stieß, die dieExecutorService
für ihn gelöst wurden.
Antworten:
Laut Java Concurrency in der Praxis :
Timer
kann empfindlich auf Änderungen in der Systemuhr reagieren,ScheduledThreadPoolExecutor
ist nicht.Timer
hat nur einen Ausführungsthread, sodass eine lange laufende Aufgabe andere Aufgaben verzögern kann.ScheduledThreadPoolExecutor
kann mit einer beliebigen Anzahl von Threads konfiguriert werden. Darüber hinaus haben Sie die volle Kontrolle über erstellte Threads, wenn Sie möchten (durch BereitstellungThreadFactory
).TimerTask
töten diesen einen Thread und machen ihnTimer
tot :-( ... dh geplante Aufgaben werden nicht mehr ausgeführt. SieScheduledThreadExecutor
fangen nicht nur Laufzeitausnahmen ab, sondern können sie auch behandeln, wenn Sie möchten (indem Sie dieafterExecute
Methode von überschreibenThreadPoolExecutor
). Aufgabe welche Die ausgelöste Ausnahme wird abgebrochen, andere Aufgaben werden jedoch weiterhin ausgeführt.Wenn Sie
ScheduledThreadExecutor
stattdessen verwenden könnenTimer
, tun Sie dies.Noch etwas ... obwohl
ScheduledThreadExecutor
es in der Java 1.4-Bibliothek nicht verfügbar ist, gibt es einen Backport von JSR 166 (java.util.concurrent
) zu Java 1.2, 1.3, 1.4 , der dieScheduledThreadExecutor
Klasse hat.quelle
Wenn es Ihnen zur Verfügung steht, fällt es Ihnen schwer, sich einen Grund vorzustellen , das Java 5 Executor Framework nicht zu verwenden. Berufung:
Sie erhalten eine
ScheduledExecutorService
ähnliche Funktionalität wieTimer
(dh sie wird mit einem Thread ausgeführt), deren Zugriff jedoch möglicherweise etwas skalierbarer ist (unter der Haube werden gleichzeitige Strukturen verwendet, anstatt eine vollständige Synchronisierung wie bei derTimer
Klasse durchzuführen). Die Verwendung vonScheduledExecutorService
bietet Ihnen auch Vorteile wie:newScheduledThreadPoolExecutor()
oderScheduledThreadPoolExecutor
Klasse)Die einzigen Gründe, an denen
Timer
ich festhalten kann, sind:quelle
TimerTask
kann die Verfügbarkeit einerscheduledExecutionTime()
Methode sein, für die es keine Entsprechung zu geben scheintScheduledExecutorService
.ExecutorService ist neuer und allgemeiner. Ein Timer ist nur ein Thread, der regelmäßig Dinge ausführt, die Sie für ihn geplant haben.
Ein ExecutorService kann ein Thread-Pool sein oder sich sogar auf andere Systeme in einem Cluster verteilen und Dinge wie einmalige Stapelausführung usw. ausführen.
Schauen Sie sich einfach an, was jeder zur Entscheidung anbietet.
quelle
Hier sind einige weitere bewährte Methoden zur Verwendung des Timers:
http://tech.puredanger.com/2008/09/22/timer-rules/
Im Allgemeinen würde ich Timer für schnelle und schmutzige Dinge und Executor für eine robustere Verwendung verwenden.
quelle
Von der Oracle-Dokumentationsseite in ScheduledThreadPoolExecutor
ExecutorService/ThreadPoolExecutor
oderScheduledThreadPoolExecutor
ist eine offensichtliche Wahl, wenn Sie mehrere Arbeitsthreads haben.Vorteile von
ExecutorService
überTimer
Timer
Die verfügbaren CPU-Kerne können nicht genutzt werden, im GegensatzExecutorService
zu mehreren Aufgaben, bei denen VariantenExecutorService
wie ForkJoinPool verwendet werdenExecutorService
Bietet eine kollaborative API, wenn Sie eine Koordination zwischen mehreren Aufgaben benötigen. Angenommen, Sie müssen N Arbeitsaufgaben einreichen und auf den Abschluss aller warten. Sie können dies problemlos mit der invokeAll- API erreichen. Wenn Sie dasselbe mit mehrerenTimer
Aufgaben erreichen möchten, ist dies nicht einfach.ThreadPoolExecutor bietet eine bessere API für die Verwaltung des Thread-Lebenszyklus.
Einige Vorteile:
ein. Sie können den Lebenszyklus von Threads erstellen / verwalten / steuern und den Aufwand für die Thread-Erstellung optimieren
b. Sie können die Verarbeitung von Aufgaben (Work Stealing, ForkJoinPool, invokeAll) usw. steuern.
c. Sie können den Fortschritt und den Zustand von Threads überwachen
d. Bietet einen besseren Mechanismus zur Behandlung von Ausnahmen
quelle
Mein Grund dafür, Timer manchmal Executors.newSingleThreadScheduledExecutor () vorzuziehen, ist, dass ich viel saubereren Code erhalte, wenn ich den Timer für die Ausführung auf Daemon-Threads benötige.
vergleichen Sie
mit
Ich mache das, wenn ich nicht die Robustheit eines Executorservices brauche.
quelle