2011-08-23 5 views
5

Alcune domande sul Esecutori migliore utilizzo per la memoria e tempo di esecuzione:Esecutori uso e il costo rigore

  1. v'è alcuna penalità costo sostenuto per l'utilizzo di

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

    rispetto a:

    new Thread(runnable).start() 
    
  2. Se uno Callable non è lungo, e non sarà mai più di eseguendo una istanza di esso è possibile utilizzare il codice da (1)? O è meglio avere ExecutorService come istanza statica e riutilizzare le chiamate?

  3. Se ho diverse attività come descritto in (2), c'è qualche problema con ogni attività di avere il proprio servizio di executor o è meglio avere uno centralizzato? (Sto parlando di un'applicazione client dove normalmente non ci sarà più di una di queste attività in esecuzione)

  4. Quali risorse consuma un Executor se non è shutdown()?

risposta

6

C'è un aggravio di costi di utilizzare

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

rispetto a:

new Thread(runnable).start() 

Sì, c'è una "sanzione": il ExecutorService molto probabilmente essere più costoso da creare in quanto crea anche una coda per le attività che stai inviando e se un th read fail prima dello shutdown, quindi il thread fallito verrà sostituito con un altro per poter eseguire qualsiasi attività successiva (quindi c'è un po 'di logica lì). Tuttavia, probabilmente non si desidera creare un ExecutiveService ogni volta che si desidera eseguire un'attività ... probabilmente non è l'uso migliore di uno ExecutorService (altro su quello nella domanda successiva).

Se un Callable non è lungo e non sarà mai più di un'istanza in esecuzione, è possibile utilizzare il codice da -1-? O è meglio avere ExecutorService come uno statico e riutilizzare le chiamate?

L'uso suggerito del ExecutorService è come un pool di thread, dove si tiene il ExecutorService intorno e mantenere le attività che presentano ad esso come a quando si hanno compiti da presentare. Può essere statico o solo un membro normale, che è irrilevante e altamente dipendente dalle vostre esigenze/design. Anche se stai eseguendo solo un'istanza alla volta (ovvero hai solo un executor a thread singolo), è ancora più efficiente usare lo ExecutorService perché riutilizza il thread, quindi a lungo termine sarà meno costoso della creazione una nuova discussione per ogni attività che invii.

Se ho diverse attività ... c'è qualche problema per ogni attività di avere il loro servizio di executor o è meglio avere uno centralizzato?

Non c'è alcun problema, ma è inefficiente, quindi è sufficiente disporre di un servizio di esecuzione centralizzata.

Quali risorse consuma un Executor se non è shutdown()?

Non credo che dovresti preoccuparti di ciò in particolare, soprattutto se stai usando il Executor nel contesto corretto sarà minimo.

0

Il punto di un ExecutorService è di condividere molte attività tra un numero fisso di thread. Creare un ExecutorService per eseguire una singola attività è un inutile sovraccarico.

new Thread(runnable).start() dovrebbe essere sempre più veloce della creazione di un ExecutorService in quanto l'ExecutorService creerà solo il thread in ogni caso, ma con l'overhead aggiunto di tenerne traccia.

Problemi correlati