209 votes

Choisir entre ExecutorService ' soumettre s et ExecutorService ' s exécuter

Je me demandais, comment je dois choisir entre ExecutorService de soumettre ou de l' exécuter, si la valeur retournée n'est pas ma préoccupation? Si j'ai tester les deux, je ne vois pas de différences entre les deux à l'exception de la valeur retournée.

    ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
    threadExecutor.execute(new Task());

    ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
    threadExecutor.submit(new Task());

217voto

hochraldo Points 585

Il y a une différence relative d'exception ou d'erreur de manipulation.

Une tâche en file d'attente avec execute() qui génère une certaine Throwable sera la cause de la UncaughtExceptionHandler de la Thread l'exécution de la tâche puisse être invoquée. La valeur par défaut UncaughtExceptionHandler, qui, en général, imprime l' Throwable trace de la pile d' System.err, sera invoquée si aucun gestionnaire personnalisé a été installé.

D'autre part, une Throwable généré par une tâche en file d'attente avec submit() liera l' Throwable de la Future qui a été produite à partir de l'appel à submit(). Appelant get() sur Future va jeter un ExecutionException avec l'original Throwable que sa cause (accessible en appelant getCause() sur le ExecutionException).

12voto

Steven Points 1922

Si vous ne se souciez le type de retour, utilisation d’execute. C’est le même que soumettre, juste sans le retour de l’avenir.

8voto

Syntax Points 791

Pris de la Javadoc:

Méthode de soumettre s'étend de la base de la méthode {@link Exécuteur#execute} par la création et de retour d'un {@link Futur} qui peut être utilisé pour annuler l'exécution et/ou attendre achèvement.

Personnellement, je préfère l'utilisation de l'exécuter, car il se sent plus déclaratif, même si c'est vraiment une question de préférence personnelle.

Pour donner plus d'informations: dans le cas de la ExecutorService mise en œuvre, la mise en œuvre principales étant retournée par l'appel à des Exécuteurs testamentaires.newSingleThreadedExecutor() est une ThreadPoolExecutor. L'soumettre les appels sont fournis par son parent AbstractExecutorService d'appel et exécuter en interne. exécuter est remplacée par/fourni par la ThreadPoolExecutor directement.

2voto

rxg Points 1871

De la Javadoc :

La commande peut s’exécuter dans un nouveau thread, dans un thread du pool ou dans le thread appelant, à la discrétion de la mise en œuvre de l’exécuteur testamentaire.

Ainsi selon l’implémentation de `` vous pouvez constater que le requérantes thread se bloque pendant l’exécution de la tâche.

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