2016-06-14 2 views
0

J'ai ci-dessous méthode dans ma demande et il est semble fonctionne très bien .. mais je ne suis pas sûr de savoir comment il est ...avenir des éclaircissements liés à 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; 

Dans les appels RestAPI de code sont ajoutés à la ThreadPoolExecutor et en attendant le résultat ..

Ma question est Puisque l'approche est basée sur un fil que l'instruction retour n'est pas exécutée jusqu'à ce que tous les fils de l'API se terminé ...

Toute chance de déclaration de retour sera de retour liste vide ?

+0

Non, 'future.get()' se bloque jusqu'à ce que la tâche produise un résultat. Seule la chance d'une liste vide est si chaque tâche génère une exception –

Répondre

3

Ma question est Puisque l'approche est basée sur un fil que l'instruction retour n'est pas exécutée jusqu'à ce que tous les fils de l'API se terminé ...

Lire la JavaDoc sur Future#get():

Attend si nécessaire que le calcul se termine, puis récupère son résultat.

Cela signifie que la boucle est bloqué jusqu'à ce que l'avenir de l'itération actuelle obtenir son résultat, à savoir lorsque la boucle est terminée, vous savez que toutes les discussions ont terminé.

Une chance de retour retournera une liste vide?

Oui, par ex. si IDS est vide ou si tous les threads échouent avec une exception.