Sto tentando di utilizzare un ThreadPoolExecutor per pianificare le attività, ma si verificano alcuni problemi con le sue politiche. Ecco il suo comportamento dichiarato:Politica ThreadPoolExecutor
- Se meno di discussioni corePoolSize sono in esecuzione, l'Esecutore sempre preferisce l'aggiunta di un nuovo thread, piuttosto che fare la coda.
- Se corePoolSize o più thread sono in esecuzione, l'Executor preferisce sempre mettere in coda una richiesta piuttosto che aggiungere un nuovo thread.
- Se una richiesta non può essere accodata, viene creato un nuovo thread a meno che questo non superi maximumPoolSize, nel qual caso l'attività verrà rifiutata.
Il comportamento voglio è questo:
- come sopra
- Se più di corePoolSize ma inferiore discussioni maximumPoolSize sono in esecuzione, preferisce l'aggiunta di un nuovo filo sopra accodamento, e utilizzando un thread inattivo oltre l'aggiunta di una nuova discussione.
- come sopra
Fondamentalmente io non voglio alcuna attività da respingere; Voglio che vengano accodati in una coda illimitata. Ma voglio avere fino a massimo threadPoolSize. Se utilizzo una coda illimitata, non genera mai thread dopo aver colpito coreSize. Se utilizzo una coda limitata, rifiuta le attività. C'è un modo per aggirare questo?
Quello a cui sto pensando ora è eseguire ThreadPoolExecutor su un SynchronousQueue, ma non nutrire attività direttamente su di esso, ma alimentarlo a un separato LinkedBlockingQueue non limitato. Quindi un altro thread si alimenta da LinkedBlockingQueue in Executor e, se uno viene rifiutato, riprova semplicemente fino a quando non viene rifiutato. Questo sembra un dolore e un po 'un trucco, però - c'è un modo più pulito per farlo?
Oops, quello che ho scritto non era esattamente quello che volevo. Ho modificato l'originale. –
Impostazione corePoolsize = maximumPoolSize è effettivamente chiuso, ma sto anche usando allowCoreThreadTimeOut (false) e prestartAllCoreThreads(). –