Sto utilizzando il framework Executors
in Java per creare pool di thread per un'applicazione multithread e ho una domanda relativa alle prestazioni.Modo ottimale per creare un pool di thread di dimensioni fisse in Java utilizzando il servizio Executors
Ho un'applicazione che può funzionare in modalità in tempo reale o non in tempo reale. Nel caso in cui è in tempo reale, sto semplicemente usando la seguente:
THREAD_POOL = Executors.newCachedThreadPool();
Ma nel caso in cui non è in tempo reale, voglio la capacità di controllare le dimensioni del mio pool di thread. Per fare ciò, sto pensando a 2 opzioni, ma non capisco davvero la differenza e quale potrebbe funzionare meglio.
opzione 1 è quello di utilizzare il modo più semplice:
THREAD_POOL = Executors.newFixedThreadPool(threadPoolSize);
opzione 2 è quello di creare il mio ThreadPoolExecutor
in questo modo:
RejectedExecutionHandler rejectHandler = new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
executor.getQueue().put(r);
} catch (Exception e) {}
}
};
THREAD_POOL = new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(10000), rejectHandler);
vorrei capire qual è il vantaggio di utilizzare il opzione più complessa 2, e anche se dovrei usare un'altra struttura dati oltre a LinkedBlockingQueue
? Qualsiasi aiuto sarebbe apprezzato.
Il 'RejectedExecutionHandler' è effettivamente bloccando, la chiamata a' executor.getQueue() mettere (r); 'bloccherà finché la coda libera, così. alla fine il mio gestore consente di mantenere una coda limitata senza interrompere alcun compito. A meno che non mi sbagli. +1 per gli altri dettagli. –
@CharlesMenguy: grazie per i chiarimenti, il mio male, aggiornerò la mia domanda. Ma cosa vuoi ottenere bloccando "RejectedExecutionHandler"? Credo che potrebbe avere alcuni effetti collaterali davvero inaspettati come il blocco del thread del chiamante. Forse hai bisogno di 'CallerRunsPolicy'? –
In realtà dopo averlo visto, 'CallerRunsPolicy' sembra davvero promettente per quello che voglio fare, ci provo grazie! Forse puoi aggiungerlo nella risposta e accetterò la tua risposta. –