Choisissez entre ExecutorService de soumettre et ExecutorService execute
Comment devrais-je choisir entre ExecutorService de soumettre ou exécuter, si la valeur retournée n'est pas ma préoccupation?
Si je l'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());
Vous devez vous connecter pour publier un commentaire.
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 certaineThrowable
sera la cause de laUncaughtExceptionHandler
pour laThread
l'exécution de la tâche puisse être invoquée. La valeur par défautUncaughtExceptionHandler
, qui, en général, imprime leThrowable
trace de la pile àSystem.err
, sera invoquée si aucun gestionnaire personnalisé a été installé.D'autre part, un
Throwable
généré par une tâche en file d'attente avecsubmit()
lient l'Throwable
à laFuture
qui a été produite à partir de l'appel àsubmit()
. L'appel deget()
sur queFuture
va jeter unExecutionException
avec l'originalThrowable
que sa cause (accessible en appelantgetCause()
sur leExecutionException
).Runnable
s'amalgament dans unTask
ou pas, que vous n'avez aucun contrôle sur. Par exemple, si votreExecutor
est en fait unScheduledExecutorService
, votre tâche en interne sont enveloppés dans unFuture
et non interceptéeThrowable
s sera lié à cet objet.Future
ou pas", bien sûr. Voir la Javadoc de ScheduledThreadPoolExecutor#execute, par exemple.exécuter: l'Utiliser pour le feu et oublier les appels
soumettre: l'Utiliser pour inspecter le résultat de l'appel de méthode et de prendre les mesures appropriées sur
Future
opposé retourné par l'appelDe la documentation javadoc
submit(Callable<T> task)
Future<?> submit(Runnable task)
Vous devez prendre des précautions lors de l'utilisation
submit()
. Il se cache exception dans le cadre lui-même, à moins que vous incorporez votre code de la tâche danstry{} catch{}
bloc.Exemple de code: Ce code avale
Arithmetic exception : /by zero
.de sortie:
Même code lance par le remplacement de
submit()
avecexecute
() :Remplacer
avec
de sortie:
Comment gérer ce type de scénarios en utilisant submit()?
CustomThreadPoolExecutor
Nouvelle solution:
de sortie:
si vous n'avez pas de soins sur le type de retour, l'utilisation de l'exécuter. c'est la même chose que se soumettre, juste sans le retour de l'Avenir.
Prises à partir de la Javadoc:
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.
De donner plus d'informations: dans le cas de la
ExecutorService
mise en œuvre, la mise en œuvre principales étant retournée par l'appel àExecutors.newSingleThreadedExecutor()
est unThreadPoolExecutor
.La
submit
appels sont fournis par son parentAbstractExecutorService
d'appel et exécuter en interne. exécuter est remplacée par/fourni par laThreadPoolExecutor
directement.De la Javadoc:
Donc, en fonction de la mise en œuvre de
Executor
vous pouvez trouver que la soumission thread se bloque alors que la tâche est en cours d'exécution.La réponse complète est une composition de deux réponses qui ont été publiés ici (plus un peu "extra"):
execute
(parce que son type de retour idvoid
)execute
s'attend à unRunnable
toutsubmit
peut prendre soit unRunnable
ou unCallable
comme un argument (pour plus d'info à propos de la différence entre les deux - voir ci-dessous).execute
des bulles tout décoché-exceptions tout de suite (il ne peut pas jeter checked exceptions!!!), alors quesubmit
lie tout sorte d'exception à l'avenir qui retourne comme résultat, et que lorsque vous appelezfuture.get()
un l' (emballée) exception sera levée . Le Throwable que vous obtiendrez est une instance deExecutionException
et si vous allez appeler cet objetgetCause()
il sera de retour l'original Throwable.Un peu plus de (relative) points:
submit
ne nécessite pas de retour d'unrésultat, vous pouvez toujours utiliser
Callable<Void>
(au lieu d'utiliser unRunnable
).Pour résumer, il est préférable d'utiliser
submit
avec unCallable
(vsexecute
avec unRunnable
). Et je vais citer de "la Java de la simultanéité dans la pratique" Par Brian Goetz:Juste en ajoutant à la accepté de répondre-
Source