2016-03-20 17 views
5

sto usando ThreadPoolExecutor come di seguito:java 8 stucks threadPoolExecutor dopo compiti N con istruzione return

ThreadPoolExecutor pool = new ThreadPoolExecutor(cores, 50, 30L, 
TimeUnit.SECONDS, new ArrayBlockingQueue<>(10)); 

e:

pool.execute(()->{ 

//code goes here 

if(some condition){ 
    return; 
} 
//code goes here 
}) 

E quando questo blocco con istruzione return è abilitata, tutti quei compiti ottiene bloccato in TPE. TPE dice che è completamente caricato e sempre genera RejectedExecutionException l'eccezione

Non riesco a capire perché succede. Ad esempio, se si dispone di un pool di dimensioni 10 e si hanno 100 attività, 10 di esse corrisponderanno se in sezione, non si accetta la 101a attività, tutte le attività successive verranno rifiutate. Perché?

+0

è piuttosto difficile dire cosa è andato storto da questa descrizione ... è stata eseguita una qualsiasi delle attività inviate? forse c'è qualche tipo di bug nel codice delle attività e sono interrotti semplicemente ... – nukie

+0

In realtà non accetti l'undicesimo compito in quanto la coda è di dimensione 10 – Antoniossss

risposta

5

Non hai correttamente configurato il ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize, 
          int maximumPoolSize, 
          long keepAliveTime, 
          TimeUnit unit, 
          BlockingQueue<Runnable> workQueue) 

Crea una nuova ThreadPoolExecutor con il dato parametri iniziali e la fabbrica del filo predefinita e respinto gestore di esecuzione. Potrebbe essere più comodo utilizzare uno dei metodi di fabbrica dell'Esecutore invece di questo costruttore generico.

Parametri:

corePoolSize - il numero di thread per mantenere in piscina, anche se sono al minimo, a meno che non allowCoreThreadTimeOut è impostato

maximumPoolSize - il numero massimo di thread per consentire in piscina

keepAliveTime - quando il numero di thread è maggiore del core, questo è il tempo massimo in cui i thread inattivi in ​​eccesso attenderanno nuove attività prima di terminare.

unit - l'unità di tempo per l'argomento KeepAliveTime

workQueue - la coda da utilizzare per lo svolgimento di compiti prima che vengano eseguite. Questa coda manterrà solo le attività eseguibili inviate dal metodo execute.

Non ho mai visto TPE con dimensioni workQueue (10) inferiore a maximumPoolSize (50). Con la configurazione corrente, l'undicesima operazione di lavoro verrà rifiutata a causa della dimensione della coda 10 (dimensione della coda in quel momento)

Aumentare la dimensione workQueue per eliminare RejectedExecutionException. 50 thread possono gestire facilmente più di 1000 operazioni di piccoli lavoratori. Configura questa dimensione della coda in base ai tuoi requisiti con un valore ragionevole.

Problemi correlati