я следующий код хэшированного:Как дождаться завершения всех вызовов, прежде чем продолжить?
public class MyCallable implements Callable<Long> {
@Override
public Long call() throws Exception {
// Do stuff...
}
}
public class MyController {
private ExecutorService executor = Executos.newCachedTreadPool();
public Long concurrentDoStuff() {
List<MyCallable> workers = makeWorkers();
List<Long> allResults = new ArrayList<Long>();
for(MyCallable worker : workers) {
Future<Long> workerResults = executor.submit(worker);
try {
allResults.add(workerResults.get());
} catch(InterruptedException ie) {
// Handle...
} catch(ExecutionException ee) {
// Handle...
}
}
// Question: how do I pause here and wait for all workers to finish?
}
}
После for
-loop, я хочу, чтобы ждать, пока все рабочие, чтобы закончить, прежде чем продолжить дальше. Каков наилучший/безопасный/наиболее эффективный способ сделать это? Заранее спасибо!
Вы хотите сначала представить все свои рабочие места, а затем ждать их результатов. В вашем коде вы ждете каждого результата, прежде чем окупить следующие задания, которые победят параллелизм. –
+1 @RalfH - вы должны хранить список фьючерсов и не разыгрывать их, пока не представите все задания. – Alex
Также вы должны скопировать/вставить код. У вас есть опечатки в приведенном выше! –