2011-08-23 12 views
5

Algunas preguntas sobre los ejecutores mejor uso de rendimiento de la memoria y el tiempo:Ejecutores uso y el costo de penalti

  1. ¿Hay alguna penalización de coste incurrido por el uso de

    ExecutorService e = Executors.newSingleThreadExecutor(); 
    e.execute(callable) 
    e.shutdown() 
    

    en comparación con:

    new Thread(runnable).start() 
    
  2. Si un Callable no es largo, y nunca será más que En una instancia corriendo, ¿está bien usar el código de (1)? ¿O es mejor tener ExecutorService como una instancia estática y reutilizar entre llamadas?

  3. Si tengo varias tareas como se describe en (2) ¿hay algún problema en cada tarea para tener su propio servicio de ejecutor o es mejor tener uno centralizado? (Estoy hablando de una aplicación de cliente donde normalmente no habrá más de una de estas tareas ejecutándose)

  4. ¿Qué recursos consume un Executor si no está apagado()?

Respuesta

6

¿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.

0

El objetivo de un ExecutorService es compartir muchas tareas entre un número fijo de subprocesos. Crear un ExecutorService para ejecutar una sola tarea es una pérdida de tiempo.

new Thread(runnable).start() siempre debe ser más rápido que crear un ExecutorService, ya que ExecutorService simplemente creará el subproceso de todos modos, pero con la sobrecarga adicional de mantener un seguimiento de ello.

Cuestiones relacionadas