2015-06-08 2 views
7

Я использую CompletableFuture, как показано ниже в коде. но относительно того, как я должен ждать, пока все runnables не закончатся, я нашел два пути, и я не знаю разницы между ними, и какая из них лучшая практика? они следующим образом:Каков рекомендуемый способ подождать, пока закончится завершающая обработка будущих окон

код:

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); 

первый подход ждать, пока все runnables закончить

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

второй подход ждать, пока все runnables закончить

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

пожалуйста, дайте мне знать, какой из них рекомендуется

+2

Оба будут работать, так что это зависит от того, что вы хотите сделать с исполнителем: если вам это больше не нужно, используйте первое - если вы хотите его повторно использовать, используйте последний ... Также в вашем первом коде snippet вы только сохраняете ссылку на последний CompletableFuture ... – assylias

ответ

4

Оба способа эквивалентны только тогда, когда исполнитель (growSeedExecutor) используется исключительно для данной задачи. Первый способ может привести к следующему: другим задачам требуется распараллеливание, и для каждой задачи создается новый исполнитель. Некоторый разработчик видит слишком много созданных исполнителей и решает использовать один общий исполнитель, но не смог удалить все выключения исполнителей ...

Итак, второй способ (join()) более надежный, так как он менее сложный. Но каждое новое будущее должно быть добавлено в growSeedFutureList, которому не присвоено.

Смежные вопросы