2013-02-20 17 views
18

È un oggetto executor che deve essere riutilizzato dopo un shutdown? Voglio dire se chiamo shutdown o shutdownNow dopo che l'esecutore è terminato, dovrei fare new per creare un nuovo pool di thread o è possibile in qualche modo "resettare"/riutilizzare l'executor terminato in precedenza e riutilizzarlo?È un esecutore che deve essere riutilizzato?

Aggiornamento:
Se ho bisogno di creare un nuovo pool di thread, come posso "capire" che il precedente è stato fermato?
E.g. la seguente:

public void startPool(){ 
    if(threadPool != null && !threadPool.isShutdown()){ 
    return; 
    } 
    threadPool = Executors.newCachedThreadPool(); 
    //other stuff 

} 

public void stopPool(){ 
    if(threadPool != null){ 
    threadPool.shutdown(); 
    } 
} 

non funzionerà. Se chiamo stop e poi start un nuovo pool di thread non verrà creato a causa delle condizioni. Qual è il modo corretto per codificarlo?

+1

non dovrebbe essere '... &&!threadPool.isShutdown() 'quindi si torna presto solo se il TP è ancora in esecuzione (cioè _started_)? –

+0

@RalfH: buon punto! Aggiornamento OP – Jim

+0

OK, e si chiama 'stop', seguito da' start' dallo stesso thread? –

risposta

16

Da the doc:

In caso di risoluzione, un esecutore non ci sono compiti attivamente l'esecuzione, non compiti in attesa di esecuzione, e non nuovi compiti possono essere presentate

così (per breve tempo), no, non puoi riutilizzarlo Da the shutdown() doc:

Avvia uno spegnimento ordinato in cui vengono eseguite le attività precedentemente inoltrate, ma non verranno accettate nuove attività.

I metodi isTerminated() e isShutdown() possono essere utilizzati per determinare se l'esecutore è stata arrestata, e che i compiti hanno completato rispettivamente.

+0

Si prega di consultare l'aggiornamento – Jim

5

1) Non è possibile riutilizzare un ThreadPoolExecutor dopo l'arresto di esso, API

An ExecutorService can be shut down, which will cause it to reject new tasks 

Nota: non spegnere il ThreadPoolExecutor se si desidera riutilizzarlo.

2) Se vuoi sapere se è necessario ricreare il ThreadPoolEdxecutor utilizzare

ExecutorService.isShutdown() 

Restituisce vero se questo esecutore è stato arrestato

+0

OK, ho aggiornato anche la mia risposta –

+0

Essenzialmente avrei dovuto eseguire un 'threadPool = null' in' stop' giusto? Sarebbe un problema? – Jim

+0

No, threadPool = Executors.newCachedThreadPool(); è abbastanza al 100% –

5

Stiamo parlando di Oracla Javas ThreadPoolExecutor (attuazione del Esecutore interfaccia) qui. Lì, il metodo di commento allo spegnimento non vieta esplicitamente una transizione Shutdown torna a esecuzione, ma il commento della classe elenca tutte le transizioni supportate da ThreadPoolExecutors e non c'è ritorno da Shutdown. Il ritorno richiede un altro metodo di riavvio/avvio o simile. Questo non esiste, ma qualcuno che lo trova utile potrebbe estendere l'interfaccia e implementare il riavvio dopo l'arresto senza interrompere la semantica di spegnimento. Fare ciò sarebbe probabilmente un po 'difficile in quanto l'arresto stesso non garantisce che l'elaborazione si fermi alla fine. Quindi gli operai possono continuare fino a quando non finiscono, se finiscono per niente. Rendere possibile il riavvio in queste circostanze probabilmente non valeva il lavoro extra rispetto alla semplice creazione di un altro esecutore.

Problemi correlati