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.