Wie soll ich wählen zwischen ExecutorService des einreichen oder ausführen , wenn der zurückgegebene Wert nicht meine Sorge ist?
Wenn ich beide teste, sehe ich keine Unterschiede zwischen den beiden außer dem zurückgegebenen Wert.
ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
threadExecutor.execute(new Task());
ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
threadExecutor.submit(new Task());
quelle
Runnable
in ein System eingewickelt werdenTask
oder nicht, über das Sie möglicherweise keine Kontrolle haben. Wenn SieExecutor
beispielsweise tatsächlich eine sindScheduledExecutorService
, wird Ihre Aufgabe intern in eine eingeschlossen,Future
und nicht erfassteThrowable
s werden an dieses Objekt gebunden.Future
natürlich "eingewickelt in ein oder nicht". Siehe beispielsweise Javadoc für ScheduledThreadPoolExecutor # execute .Ausführen : Verwenden Sie es für Feuer und vergessen Sie Anrufe
submit : Verwenden Sie diese Option, um das Ergebnis des Methodenaufrufs zu überprüfen und geeignete Maßnahmen für
Future
vom Aufruf zurückgegebene Objekte zuergreifenVon Javadocs
submit(Callable<T> task)
Future<?> submit(Runnable task)
Sie müssen bei der Verwendung Vorsichtsmaßnahmen treffen
submit()
. Es verbirgt Ausnahmen im Framework selbst, es sei denn, Sie binden Ihren Aufgabencode intry{} catch{}
Block ein.Beispielcode: Dieser Code schluckt
Arithmetic exception : / by zero
.Ausgabe:
Gleicher Code wird durch Ersetzen
submit()
durchexecute
() ausgelöst :Ersetzen
mit
Ausgabe:
Wie gehe ich mit solchen Szenarien um, wenn ich submit () verwende?
CustomThreadPoolExecutor
Neue Lösung:
Ausgabe:
quelle
Wenn Sie sich nicht für den Rückgabetyp interessieren, verwenden Sie execute. Es ist dasselbe wie Submit, nur ohne die Rückkehr von Future.
quelle
Entnommen aus dem Javadoc:
Persönlich bevorzuge ich die Verwendung von execute, weil es sich deklarativer anfühlt, obwohl dies wirklich eine Frage der persönlichen Präferenz ist.
Weitere Informationen: Im Fall der
ExecutorService
Implementierung ist die Kernimplementierung, die vom Aufruf an zurückgegebenExecutors.newSingleThreadedExecutor()
wird, aThreadPoolExecutor
.Die
submit
Anrufe werden vom übergeordnetenAbstractExecutorService
Anruf bereitgestellt und alle Anrufe werden intern ausgeführt. Ausführen wird von derThreadPoolExecutor
direkt überschrieben / bereitgestellt .quelle
Aus dem Javadoc :
Abhängig von der Implementierung von können
Executor
Sie feststellen, dass der sendende Thread blockiert, während die Aufgabe ausgeführt wird.quelle
Die vollständige Antwort besteht aus zwei Antworten, die hier veröffentlicht wurden (plus ein bisschen "extra"):
execute
(weil seine Rückgabetyp-IDvoid
)execute
erwartet, dass eineRunnable
Weilesubmit
entweder aRunnable
oder aCallable
als Argument nehmen kann (für weitere Informationen über den Unterschied zwischen den beiden - siehe unten).execute
sprudelt keine unkontrollierte-Ausnahmen sofort (nicht überprüft Ausnahmen werfen kann !!!), währendsubmit
bindet jeder in die Zukunft Art der Ausnahme , dass die Renditen als Ergebnis, und nur , wenn Sie rufenfuture.get()
die a (verpackt) Ausnahme ausgelöst wird. Das Throwable, das Sie erhalten, ist eine Instanz von.ExecutionException
Wenn Sie dieses Objekt aufrufengetCause()
, wird das ursprüngliche Throwable zurückgegeben.Noch ein paar (verwandte) Punkte:
submit
kein Ergebnis zurückgegeben werden muss, können Sie sie weiterhin verwendenCallable<Void>
(anstelle von aRunnable
).Zusammenfassend ist es eine bessere Praxis,
submit
mit aCallable
(vs.execute
mit aRunnable
) zu arbeiten. Und ich zitiere aus "Java-Parallelität in der Praxis" von Brian Goetz:quelle
Einfach zur akzeptierten Antwort hinzufügen-
Quelle
quelle