¿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

Runnableenvoltura se realizaTasko no, sobre lo cual puede no tener control. Por ejemplo, si suExecutores realmente unScheduledExecutorService, su tarea se envolverá internamente en unaFuturey losThrowables no capturados se vincularán a este objeto.Futureo 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
Futureobjeció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 ()?
CustomThreadPoolExecutorNueva 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
ExecutorServiceimplementación, la implementación principal que devuelve la llamada aExecutors.newSingleThreadedExecutor()es aThreadPoolExecutor.Las
submitllamadas son proporcionadas por su padreAbstractExecutorServicey todas las llamadas se ejecutan internamente. ejecutar es anulado / proporcionado por elThreadPoolExecutordirectamente.fuente
Del Javadoc :
Por lo tanto, dependiendo de la implementación,
Executores 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)executeespera que unRunnablemomentosubmitpueda tomar aRunnableo aCallablecomo argumento (para obtener más información sobre la diferencia entre los dos, consulte a continuación).executedispara cualquier excepción no verificada de inmediato (¡no puede arrojar excepciones marcadas!), mientras quesubmitvincula 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 instanciaExecutionExceptiony, si llamas a este objeto,getCause()devolverá el Throwable original.Algunos puntos más (relacionados):
submitno requiere devolver un resultado, aún puede usarCallable<Void>(en lugar de usar aRunnable).En resumen, es una mejor práctica usar
submitcon unCallable(vs.conexecuteunRunnable). Y citaré de "concurrencia de Java en la práctica" Por Brian Goetz:fuente
Solo agregando a la respuesta aceptada
Fuente
fuente