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
Runnable
acpuService
che esegue unCallable
inioService
. BloccacpuService
durante l'esecuzione diCallable
. - Invia un
Runnable
aioService
che esegue unRunnable
incpuService
. BloccaioService
durante l'esecuzione del secondoRunnable
. - Crea un'implementazione
Runnable
con un costruttore diIOTaskResult
, consentendo aioService
runnables 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
Runnable
al 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 ilRunnable
semplicemente avvolge il metodo e compila i parametri per me.
C'è un buon modo per gestirlo? Mi piacerebbe sentire alcuni pensieri.