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.

War es hilfreich?

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 (indem ThreadFactory) wollen.
  • Runtime Ausnahmen in TimerTask geworfen töten, dass ein Thread, wodurch Timer 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 zwingende afterExecute Methode von ThreadPoolExecutor). 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 die ScheduledThreadPoolExecutor-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

  1. Timer kann nicht die Vorteile der verfügbaren CPU-Kerne im Gegensatz zu ExecutorService nehmen vor allem mit mehreren Aufgaben Aromen von ExecutorService wie ForkJoinPool
  2. 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 mehreren Timer Aufgaben erreichen wollen, wäre es nicht einfach sein.
  3. 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

    überwachen

    d. Bietet eine bessere Ausnahmebehandlung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top