Sono stato sconcertante su una buona implementazione per questo per un po '. Ho un programma che esegue un'operazione I / O di lunga durata (scaricando un file) e un'operazione CPU a esecuzione prolungata (analizzando il suo contenuto). Per migliorare l'efficienza, volevo che un pool di thread eseguisse la sezione I / O e facesse passare le attività a un altro pool di thread che esegue la sezione CPU. In questo modo, è improbabile che tutti i thread rimangano bloccati sull'intero I / O o sulla CPU. A seconda del file, un'operazione probabilmente richiederà più tempo dell'altra.
Qual è il modo migliore per eseguire un hand-off tra pool di thread? Supponendo che sto usando Java con due ExecutorServices, in questo modo:
int threads = Runtime.getRuntime().availableProcessors();
ExecutorService ioService = Executors.newFixedThreadPool(threads);
ExecutorService cpuService = Executors.newFixedThreadPool(threads);
public BigFile ioTask(){
return Connection.downloadBigFile();
}
public void cpuTask(BigFile bigFile){
processBigFile(bigFile);
}
Qual è il modo migliore per far eseguire un'attività in ioService per aggiungere un'attività a cpuService mentre si trasferiscono i dati in essa?
Quello che ho considerato:
- Invia un
RunnableacpuServiceche esegue unCallableinioService. BloccacpuServicedurante l'esecuzione diCallable. - Invia un
RunnableaioServiceche esegue unRunnableincpuService. BloccaioServicedurante l'esecuzione del secondoRunnable. - Crea un'implementazione
Runnablecon un costruttore diIOTaskResult, consentendo aioServicerunnables di inviare queste implementazioni acpuService. Trasforma un oggetto di elaborazione riutilizzabile in un oggetto processo consumabile, che aggiunge un ulteriore sovraccarico. - Aggiungi un metodo per generare un
Runnableal processore di task della CPU. Questo mi sembra una soluzione e un tipo di "hack-y", considerando che ho un metodo che posso chiamare e ilRunnablesemplicemente avvolge il metodo e compila i parametri per me.
C'è un buon modo per gestirlo? Mi piacerebbe sentire alcuni pensieri.