2017-09-22 8 views
0

je liste donnée en javapour une liste comment créer un future tâche à un moment

List<String> list; 

et moi avons une fonction qui prend et donne chaîne CompletionStage. Je veux itérer par liste et traiter chaque tâche séquentiellement, c'est quand une tâche donne le résultat alors seulement je veux planifier la prochaine tâche de la liste. Existe-t-il un moyen de faire cela asynchrone sans appeler .get()

Je veux également que la capacité s'arrête quelque part à mi-chemin, en fonction du résultat de la tâche précédente.

+0

Si vous attendez le résultat de la tâche en cours, pourquoi ne pas l'implémenter singlethreaded au lieu de futures? – kerberos84

+0

pour économiser des ressources? sinon, le fil sera bloqué. – hridayesh

+0

Puisque vous voulez exécuter des tâches de manière séquentielle, un thread devrait suffire pour cela. Si vous voulez traiter d'autres choses en même temps, vous exécutez toutes vos tâches dans un thread distinct et maintenez votre thread principal en cours d'exécution. – kerberos84

Répondre

1
// Starting off like this means the loop doesn't need to special case the first iteration 
CompletionStage<Result> stage = CompletableFuture.completedFuture(null); 
for (String str : list) { 
    stage = stage.thenCompose(result -> shouldStop(result) ? result : yourFunction(str)); 
} 

Le résultat final est que stage est la fin d'une longue séquence de CompletionStage tous les objets à chainer. Chaque étape de la séquence ne s'exécutera que lorsque l'étape précédente sera terminée, car c'est ainsi que fonctionne thenCompose (et toutes les méthodes de chaînage CompletionStage). Chaque étape appellera votre fonction et passera le résultat à l'étape suivante - jusqu'à ce que vous obteniez le résultat que vous voulez arrêter, à quel point le contrôle shouldStop fera passer toutes les étapes restantes jusqu'à ce que stage lui-même soit complété avec cette valeur de résultat.

+0

Oui c'est exactement ce que j'ai découvert et son fonctionnement. – hridayesh

0

Vous pouvez faire une boucle dans votre liste à l'aide d'une boucle personnalisée, puis à l'intérieur de la boucle, vous pouvez faire ce que vous voulez, comme continuer, pause, ...

ici est un exemple de la façon dont vous pouvez parcourir une liste en java:

List<String> list;//here assumed that you already initialized your list 

for(String l: list) {//here each element of list is called l 
//Do what ever you want to do here 
System.out.println("single element of list: "+ l); 
} 

J'espère que c'est ce que vous cherchez. me mettre à jour si cela fonctionne ou non des modifications