2016-06-14 17 views
0

ich unten Methode in meiner Anwendung haben und es sieht gut funktioniert .. aber ich bin nicht sicher, wie es ist ...der Zukunft Klärung in Java

ArrayList arr = new ArrayList(); 
Collection<Future<?>> futures = new LinkedList<Future<?>>(); 
RestCallThread thread = null; 
HttpHeaders header = getAuthHeader(authorization); 
for (String ids : IDS) { 
    thread = new RestCallThread(ids, header); 
    futures.add(executor.submit(thread)); 
} 

for (Future<?> future : futures) { 
    try { 
     arr.add(future.get()); 
    } catch (InterruptedException | ExecutionException e) { 
     e.printStackTrace(); 
    } 
} 
return arr; 

In den Code RestAPI Anrufe an die ThreadPoolExecutor hinzugefügt und warten auf das Ergebnis ..

Meine Frage Da der Ansatz auf Thread basiert, wie der return-Anweisung nicht, bis alle API-Threads abgeschlossen wird ausgeführt ...

Jede Chance der return-Anweisung erhalten werden leere Liste zurück ?

+0

Nein, 'future.get()' blockiert, bis die Aufgabe ein Ergebnis liefert. Die einzige Möglichkeit einer leeren Liste besteht darin, dass jede Task eine Ausnahme auslöst –

Antwort

3

Meine Frage Da der Ansatz auf Thread basiert, wie der return-Anweisung nicht, bis alle API-Threads ausgeführt wird, abgeschlossen zu bekommen ...

Lesen Sie die JavaDoc auf Future#get():

Wartet, wenn die Berechnung abgeschlossen werden muss, und ruft dann das Ergebnis ab.

, dass die Schleife bedeutet, wird blockiert, bis die Zukunft des aktuellen Iteration das Ergebnis erhalten, das heißt, wenn die Schleife beendet ist Sie wissen, dass alle Threads beendet haben.

Jede Möglichkeit der Rückkehr Aussage wird leere Liste zurückgeben?

Ja, z.B. wenn IDS leer ist oder wenn alle Threads mit einer Ausnahme fehlschlagen.