¿Hay alguna penalización de coste del uso de
ExecutorService e=Executors.newSingleThreadExecutor();
e.execute(callable)
e.shutdown()
en comparación con:
new Thread(runnable).start()
Sí, hay una "pena": el ExecutorService
lo más probable ser más costoso de crear ya que también crea una cola para las tareas que estás enviando y si la lectura falla antes del apagado, luego el hilo fallido será reemplazado por otro para ejecutar cualquier tarea posterior (por lo que hay bastante lógica allí). Sin embargo, probablemente no desee crear un ExecutiveService
cada vez que quiera ejecutar una tarea ... probablemente no sea el mejor uso de un ExecutorService
(más sobre esto en la próxima pregunta).
Si una Llamada no es larga, y nunca se ejecutará más de una vez, ¿está bien usar el código de -1-? ¿O es mejor tener ExecutorService como uno estático y reutilizar entre llamadas?
El uso sugerido de la ExecutorService
es como un grupo de subprocesos, donde se mantiene la ExecutorService
alrededor y mantener las tareas de someterse a ella todo el tiempo que tiene para presentar tareas. Puede ser estático o simplemente un miembro regular, que es irrelevante y depende en gran medida de sus requisitos/diseño. Incluso si solo está ejecutando una instancia a la vez (es decir, solo tiene un ejecutor de subproceso único), es aún más eficaz usar el ExecutorService
porque reutiliza el subproceso, por lo que a largo plazo será menos costoso que la creación. un nuevo hilo para cada tarea que envíes.
Si tengo varias tareas ... ¿hay algún problema para que cada tarea tenga su servicio de ejecutor o es mejor tener una centralizada?
No hay problema, pero es ineficiente, así que solo tiene un servicio de ejecutor centralizado.
¿Qué recursos consume un ejecutor si no se cierra()?
No creo que deba preocuparse por eso en particular, especialmente si está usando el Executor
en el contexto correcto, será mínimo.