2011-10-13 3 views

risposta

19

Supponete di avere una serie di compiti A, B, C, D, E e si desidera eseguire ciascuna di esse in modo asincrono in un Executor ed elaborare i risultati 1 da 1 come completano.

Con una Executor, si dovrebbe farlo in questo modo:

List<Future<?>> futures = new ArrayList<Future<?>>(); 
futures.add(executorService.submit(A)); 
futures.add(executorService.submit(B)); 
futures.add(executorService.submit(C)); 
futures.add(executorService.submit(D)); 
futures.add(executorService.submit(E)); 

//This loop must process the tasks in the order they were submitted: A, B, C, D, E 
for (Future<?> future:futures) { 
    ? result = future.get(); 
    // Some processing here 
} 

Il problema di questo metodo è che non v'è alcuna garanzia che il compito A completerà prima. Pertanto, è possibile che il thread principale stia bloccando oziosamente in attesa che l'attività A si completi quando potrebbe elaborare il risultato di un'altra attività (ad esempio, attività B). La latenza di elaborazione dei risultati potrebbe essere ridotta utilizzando ExecutorCompletionService.

List<Future<?>> futures = new ArrayList<Future<?>>(); 
futures.add(executorCompletionService.submit(A)); 
futures.add(executorCompletionService.submit(B)); 
futures.add(executorCompletionService.submit(C)); 
futures.add(executorCompletionService.submit(D)); 
futures.add(executorCompletionService.submit(E)); 

//This for loop will process the tasks in the order they are completed, 
//regardless of submission order 
for (int i=0; i<futures.size(); i++) { 
    ? result = executorCompletionService.take().get(); 
    // Some processing here 
} 

Quindi, in sostanza, ExecutorCompletionService potrebbero essere utilizzati per spremere un po 'di più l'efficienza quando l'ordine dei risultati delle attività di trasformazione non ha importanza.

Una cosa importante da notare però. L'implementazione di ExecutorCompletionService contiene una coda di risultati. Se take o poll non vengono chiamati per il drenaggio di tale coda, si verificherà una perdita di memoria. Alcune persone usano il Future restituito da submit per elaborare i risultati e questo NON è l'utilizzo corretto.

+0

l'utilizzo corretto è solo per creare il futuro da soli;) – bestsss

+1

Grazie mille Tim per il vostro supporto. L'esempio e la spiegazione sono chiari. –

+0

Una risposta così incredibile e ha ottenuto solo 18 voti finora. Questo mi rende triste. Quel bambino sembra così carino nelle tue mani. –