2012-04-17 16 views
7

Desidero creare un pool di thread di dimensioni fisse che non ammetta attività nella coda. In altre parole, se il pool di thread è attualmente in uso, l'attività in arrivo deve essere rifiutata completamente. In base allo documentation, un modo per farlo, a mio avviso, sarebbe creare un oggetto fittizio Queue che rifiuta di ammettere un'attività. Qual è il modo idiomatico per realizzare questo in Java?ThreadPoolExecutor senza coda

risposta

10

È possibile utilizzare uno SynchronousQueue nel proprio ThreadPoolExector che è una coda che non contiene oggetti. Il pool di thread memorizzato nella cache lo utilizza perché crea nuovi thread su richiesta.

Se non può essere accodato, suggerirei di utilizzare lo RejectedExecutionHandler per eseguire l'attività nel thread corrente. In questo modo verrà sempre eseguito "immediatamente".

BTW: Sarebbe utile chiarire il motivo per cui si desidera eseguire questa operazione.

0

Puoi spiegare perché vuoi fare una cosa del genere? Lo scopo fondamentale di un TP + Q è quello di avere un "meccanismo di detenzione" automatico per il lavoro e disgiungere gli operatori dal processo di creazione del lavoro. Se il tuo intento è di avere solo tanti pacchetti di lavoro accettabili come lavoratori, allora non hai davvero bisogno di un TPE.

+0

L'attività può essere prelevata da un altro executor del pool di thread con thread liberi, anziché attendere nella coda del primo. Cosa dovrei usare al posto di un ThreadPoolExecutor? –

+0

Se si desidera controllare l'esecuzione, TPE non è la vostra scelta. È meglio disporre di una semplice raccolta di thread di lavoro a cui è possibile consegnare il lavoro (se disponibili) un semplice Set che si costruisce e si tira/spinge i fili dentro e fuori dal thread principale. – vivekv

Problemi correlati