2009-10-05 4 views
16

Anche in questo scenario di test il numero di attività (thread) inviate non è enorme.Perché Executors.newCachedThreadPool genera java.util.concurrent.RejectedExecutionException durante l'invio

+2

Potresti perfezionare la tua domanda? Per esempio. aggiungi un breve banco di prova. – Kutzi

+0

Siamo spiacenti, non c'è molto codice che posso condividere a causa di motivi IP. Nel guscio di noce, sto chiamando invia con Callable tipi. Sto cercando potenziali scenari questo può accadere. –

+1

Stai dicendo che non esiste uno scenario specifico che stai guardando, ma invece vorrebbe sapere degli scenari ipotetici in cui questa eccezione potrebbe essere generata? In tal caso, è necessario riformulare la domanda da "Perché fa ..." a "Quando ..." – akf

risposta

30

Avrete bisogno di fornire esempi di codice di come si crea un'istanza e chiamare submit sulla piscina (IP dovrebbe essere un non-problema qui come non abbiamo bisogno di dettagli la struttura interna dei vostri Callable classi o qualcosa di simile quella).

In base alle informazioni che hai fornito, stai quasi certamente chiudendo il servizio executor da qualche parte prima di inviare il callable ad esso. Controlla se effettui chiamate a shutdown o shutdownNow e, in tal caso, assicurati di non aggiungere attività dopo questo punto.

Oltre a ciò, è possibile registrare la propria implementazione di java.util.concurrent.RejectedExecutionHandler per facilitare il debug; il suo messaggio rejectedExecution verrà chiamato ogni volta che l'executor non è in grado di accettare un'attività, quindi è possibile inserire una logica di ispezione dello stato rudimentale per aiutarvi a trovare la causa.

+0

Avevi ragione; Ho trovato il codice che stava chiudendo il pool di executor; Grazie –

25

Non vedo da nessuna parte nell'invocazione dei metodi Executors.newCachedThreadPool() in cui viene generato un RejectedExecutionException. Ci sono solo tre casi in cui sembra essere gettato in Java 6:

  • quando si chiama execute() su una ThreadPoolExecutor e la dimensione massima del pool è stato raggiunto.
  • quando si chiama execute() su un ThreadPoolExecutor allo stesso tempo che shutdownNow e ha essenzialmente perso la gara con la chiamata shutdownNow.
  • durante il tentativo di pianificare l'esecuzione di un eseguibile in un ScheduledThreadPoolExecutor dopo l'arresto dell'esecutore.
+4

+1 per elencare tutti i possibili casi –

Problemi correlati