¿Cómo debo elegir entre el envío o la ejecución del ExecutorService , si el valor devuelto no es de mi incumbencia?
Si pruebo ambos, no vi ninguna diferencia entre los dos excepto el valor devuelto.
ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
threadExecutor.execute(new Task());
ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
threadExecutor.submit(new Task());
fuente
Runnable
envoltura se realizaTask
o no, sobre lo cual puede no tener control. Por ejemplo, si suExecutor
es realmente unScheduledExecutorService
, su tarea se envolverá internamente en unaFuture
y losThrowable
s no capturados se vincularán a este objeto.Future
o no', por supuesto. Consulte el Javadoc para ScheduledThreadPoolExecutor # execute , por ejemplo.ejecutar : Úselo para disparar y olvidar llamadas
enviar : Úselo para inspeccionar el resultado de la llamada al método y tomar las medidas apropiadas en caso de
Future
objeción devuelta por la llamadaDe javadocs
submit(Callable<T> task)
Future<?> submit(Runnable task)
Debe tomar precauciones mientras lo usa
submit()
. Oculta la excepción en el propio marco a menos que inserte su código de tarea entry{} catch{}
bloque.Código de ejemplo: este código se traga
Arithmetic exception : / by zero
.salida:
El mismo código arroja reemplazando
submit()
conexecute
():Reemplazar
con
salida:
¿Cómo manejar este tipo de escenarios mientras se usa submit ()?
CustomThreadPoolExecutor
Nueva solución:
salida:
fuente
si no le importa el tipo de retorno, use ejecutar. es lo mismo que enviar, solo sin el regreso de Future.
fuente
Tomado del Javadoc:
Personalmente prefiero el uso de execute porque se siente más declarativo, aunque esto realmente es una cuestión de preferencia personal.
Para dar más información: en el caso de la
ExecutorService
implementación, la implementación principal que devuelve la llamada aExecutors.newSingleThreadedExecutor()
es aThreadPoolExecutor
.Las
submit
llamadas son proporcionadas por su padreAbstractExecutorService
y todas las llamadas se ejecutan internamente. ejecutar es anulado / proporcionado por elThreadPoolExecutor
directamente.fuente
Del Javadoc :
Por lo tanto, dependiendo de la implementación,
Executor
es posible que el hilo de envío se bloquee mientras se ejecuta la tarea.fuente
La respuesta completa es una composición de dos respuestas que se publicaron aquí (más un poco "extra"):
execute
(debido a su id de tipo de retornovoid
)execute
espera que unRunnable
momentosubmit
pueda tomar aRunnable
o aCallable
como argumento (para obtener más información sobre la diferencia entre los dos, consulte a continuación).execute
dispara cualquier excepción no verificada de inmediato (¡no puede arrojar excepciones marcadas!), mientras quesubmit
vincula cualquier tipo de excepción al futuro que regrese como resultado, y solo cuando llame afuture.get()
una excepción (envuelta) se lanzará. El Throwable que obtendrás es una instanciaExecutionException
y, si llamas a este objeto,getCause()
devolverá el Throwable original.Algunos puntos más (relacionados):
submit
no requiere devolver un resultado, aún puede usarCallable<Void>
(en lugar de usar aRunnable
).En resumen, es una mejor práctica usar
submit
con unCallable
(vs.conexecute
unRunnable
). Y citaré de "concurrencia de Java en la práctica" Por Brian Goetz:fuente
Solo agregando a la respuesta aceptada
Fuente
fuente