285 votes

Minuterie de Java vs ExecutorService ?

J’ai le code où je planifie une tâche à l’aide de . Je regardais autour et j’ai vu peut faire la même chose. Donc cette question ici, avez-vous utilisé Timer et `` pour planifier des tâches, quel est l’avantage d’une utilisation plutôt qu’une autre ?

Aussi a voulu vérifier si quelqu'un a utilisé la classe et couru dans n’importe quel qui émet le résolu pour eux.

339voto

Peter Štibraný Points 17507

Selon la Java de la Simultanéité dans la Pratique:

  • La minuterie peut être sensible à des changements dans le système de l'horloge, ScheduledThreadPoolExecutor n'est-ce pas
  • La minuterie n'a qu'un seul thread d'exécution, de longue tâche en cours d'exécution peut retarder les autres tâches. ScheduledThreadPoolExecutor peut être configuré avec un nombre de threads. En outre, vous avez le plein contrôle sur les threads créés, si vous le souhaitez (en fournissant ThreadFactory)
  • des exceptions d'exécution jeté dans TimerTask tuer qu'un seul thread, et donc de faire de la Minuterie mort :-( ... c'est à dire les tâches planifiées ne marchera plus. ScheduledThreadExecutor pas seulement attrape les exceptions d'exécution, mais il vous permet de gérer eux si vous le souhaitez (en remplaçant afterExecute méthode de ThreadPoolExecutor). La tâche qui a jeté exception sera annulée, mais d'autres tâches de continuer à fonctionner.

Si vous pouvez utiliser ScheduledThreadExecutor au lieu de la Minuterie, le faire.

Une chose de plus... alors que ScheduledThreadExecutor n'est pas disponible dans Java 1.4 bibliothèque, il est Backport ot JSR 166 (java.util.simultanées) à Java 1.2, 1.3, 1.4, qui a ScheduledThreadExecutor classe.

66voto

Neil Coffey Points 13408

Si elle est disponible pour vous, alors il est difficile de penser à une raison de ne pas utiliser le Java 5 exécuteur cadre. Appelant:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();

vous donnera un ScheduledExecutorService avec des fonctionnalités similaires à l' Timer (c'est à dire qu'il sera mono-thread), mais dont l'accès peut être un peu plus évolutive (sous le capot, il utilise simultanés des structures plutôt que la synchronisation complète qu'avec l' Timer de la classe). À l'aide d'un ScheduledExecutorService vous donne également des avantages tels que:

  • Vous pouvez le personnaliser si besoin est (voir l' newScheduledThreadPoolExecutor() ou ScheduledThreadPoolExecutor de la classe)
  • Le "one off" exécutions peuvent renvoyer des résultats

Sur les seules raisons pour coller à l' Timer je pense:

  • Il est disponible en pré Java 5
  • Une catégorie similaire est prévue dans J2ME, ce qui pourrait faire le portage de votre application plus facile (mais il ne serait pas terriblement difficile pour ajouter un calque de l'abstraction dans ce cas)

29voto

Dustin Points 35205

ExecutorService est plus récent et plus générale. Une minuterie est juste un thread qui exécute périodiquement les trucs que vous avez planifié pour elle.

Un ExecutorService peut être un pool de threads, ou même répartis dans les autres systèmes dans un cluster et faire des choses comme l’exécution de commandes ponctuelles, etc....

Il suffit de regarder ce que chacune offre de décider.

17voto

Alex Miller Points 28225

Voici certaines plus bonnes pratiques autour de l’utilisation de la minuterie :

http://Tech.puredanger.com/2008/09/22/Timer-Rules/

En général, j’utiliserais Timer pour trucs rapide et sale et exécuteur testamentaire pour une utilisation plus robuste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X