2015-06-08 8 views
7

Sto utilizzando CompletableFuture come mostrato di seguito nel codice. ma riguardo al modo in cui dovrei aspettare fino alla fine di tutti i runnables, ho trovato due modi e non conosco la differenza tra loro e quale è la migliore pratica? sono i seguenti:Qual è il modo consigliato di attendere il completamento dei thread futuri completabili

codice:

this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedSERun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor); 
      this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedNWRun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor); 
      this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedNERun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor); 
      this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedSWRun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor); 

primo approccio di aspettare fino a che tutti runnables finiscono

this.growSeedExecutor.shutdown(); 
this.growSeedExecutor.awaitTermination(1, TimeUnit.DAYS); 

secondo approccio di aspettare fino a che tutti runnables finiscono

CompletableFuture.allOf(this.growSeedFutureList).join(); 

fatemelo sapere quale è raccomandato

+2

Entrambi funzionerebbero quindi dipende da cosa si vuole fare con l'executor: se non ne hai più bisogno usa il primo - se vuoi riutilizzarlo usa quest'ultimo ... Anche nel tuo primo codice snippet tieni solo un riferimento all'ultimo CompletableFuture ... – assylias

risposta

4

Entrambi i metodi sono equivalenti solo quando l'esecutore (growSeedExecutor) viene utilizzato esclusivamente per il compito affidato. Il primo modo può portare a seguire: Altre attività richiedono la parallelizzazione e viene creato un nuovo esecutore per ogni attività. Alcuni sviluppatori vedono troppi esecutori creati e decidono di utilizzare un singolo esecutore comune, ma non riescono a eliminare tutti gli arresti di executor ...

Quindi il secondo modo (join()) è più affidabile, poiché è meno complesso. Ma ogni nuovo futuro dovrebbe essere aggiunto a growSeedFutureList, non assegnato a.

Problemi correlati