Domanda

esecutore sembra un'astrazione pulita. Quando si desidera utilizzare Discussione direttamente, piuttosto che fare affidamento su l'esecutore più robusto?

È stato utile?

Soluzione

Per dare un po 'di storia, Esecutori sono stati aggiunti solo come parte dello standard Java in Java 1.5. Quindi, in un certo senso Esecutori possono essere visti come una nuova astrazione meglio per trattare con compiti eseguibile.

Un po 'di una semplificazione eccessiva venire ... - Esecutori sono discussioni fatte proprio così li usano di preferenza

.

Altri suggerimenti

Io uso Discussione quando ho bisogno di un po 'di elaborazione dei messaggi di tiro basato. Per esempio. una coda è prendere () - it in un ciclo in un thread separato. Ad esempio, si avvolge una coda in un contesto costoso -. Diciamo una connessione JDBC, connessione JMS, file da elaborare dal singolo disco, etc

Prima vengo maledetto, hai qualche scenario?

Modifica :

Come già detto da altri, l'interfaccia Executor (ExecutorService) ha più potenziale, come si può utilizzare il Executors per selezionare un comportamento: in programma, priorità, ecc cache in Java 5+ o un backport juc per Java 1.4

Il quadro esecutore ha la protezione contro schiantato runnables e automaticamente ri-creare thread di lavoro. Uno svantaggio, a mio parere, che si deve shutdown() esplicitamente e li awaitTermination() prima di chiudere l'applicazione - che non è così facile in applicazioni GUI. Se si utilizzano le code limitati è necessario specificare un RejectedExecutionHandler oi nuovi runnables ottenere gettato via.

Si potrebbe avere uno sguardo a Brian Goetz et al: Java Concurrency in Practice (2006)

Non v'è alcun vantaggio di utilizzare fili greggi. È sempre possibile fornire Esecutori con una fabbrica Thread, quindi, anche la possibilità di creazione di thread personalizzato è coperto.

Non si utilizza Discussione a meno che non avete bisogno di un comportamento più specifica che non si trova in discussione se stessa. È quindi estendere Discussione e aggiungere il vostro comportamento specificamente carenti.

Altrimenti basta usare Runnable o esecutore.

Bene, ho pensato che una ThreadPoolExecutor fornito prestazioni migliori gestisce un pool di thread, minimizzando l'overhead di istanziare un nuovo filo, l'allocazione di memoria ...

E se avete intenzione di lanciare migliaia di fili, ti dà alcune funzionalità di accodamento si dovrebbe programmare da soli ...

Fili & Esecutori sono diversi strumenti, utilizzato su diversi scenari ... come la vedo io, è come chiedere perché dovrei usare ArrayList quando posso usare HashMap? Sono diversi ...

pacchetto java.util.concurrent fornisce un'interfaccia esecutore e può essere utilizzato per thread creato.

L'interfaccia esecutore fornisce un singolo metodo, eseguire, progettato per essere un rimpiazzo per un comune linguaggio filo-creazione. Se r è un oggetto Runnable, ed e è un oggetto esecutore è possibile sostituire

(new Thread (r)) start ();.

con

e.execute (r);

qui

E 'sempre meglio preferire esecutore per Thread anche per singolo thread come sotto

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);

È possibile utilizzare Thread oltre Executor in scenari di sotto

  1. L'applicazione ha bisogno di filo (s) limitata e la logica di business è semplice

  2. Se semplice modello multi-threading si rivolge la vostra esigenza, senza discussione Pool

  3. Si è sicuri di gestire scenari filo (s) del ciclo di vita di gestione delle eccezioni + con l'aiuto di API di basso livello nelle aree di seguito: Inter thread communication, Exception handling, reincarnation of threads a causa di errori imprevisti

e un ultimo punto

  1. Se la vostra applicazione non necessita di personalizzazione delle varie caratteristiche del ThreadPoolExecutor

    ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, 
    TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, 
    RejectedExecutionHandler handler)
    

In tutti gli altri casi, si può andare per ThreadPoolExecutor

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top