2017-09-05 1 views
0

permet de dire que nous avons la situation suivante:Java: Comment exécuter des appels asynchrones consécutifs dans l'ordre avec Vertx?

public static void main(String[] args) { 
    Vertx vertx = Vertx.vertx(); 
    String alphabet = "AB"; 
    String[] splittedAlphabet = alphabet.split(""); 

for (int i = 1; i <= 5; i++) { 
    List<String> list = Arrays.asList(splittedAlphabet); 
    Iterator<String> iterator = list.iterator(); 
    final int number = i; 

    //async call 
    vertx.setPeriodic(1000, id -> { 
     if (iterator.hasNext()) { 
      System.out.println(iterator.next() + " i: " + number); 
     } else { 
      vertx.cancelTimer(id); 
     } 
    }); 

} 
} 

Nous avons un for extérieur -Boucle et une vertx.setPeriodic{} -Boucle intérieure qui imprime de façon asynchrone le numéro d'index i. L'extérieur for -loop déclenche pour chaque numéro d'index cinq appels asynchrones de l'intérieur Vertx -Loop. Cette boucle interne parcourt tous les personnages (dans notre cas, 'A' et 'B'). Cela signifie que chaque numéro d'index est combiné avec chaque caractère, qui sont appelés de manière asynchrone. C'est pourquoi il n'y a aucune garantie pour l'ordre dans la sortie. Thats ce que je suis:

A i: 1 
A i: 2 
A i: 5 
A i: 4 
A i: 3 
B i: 4 
B i: 5 
B i: 1 
B i: 3 
B i: 2 

Mais ce que je veux est (et de garder la boucle asynchrone intérieure):

A i: 1 
A i: 2 
A i: 3 
A i: 4 
A i: 5 
B i: 1 
B i: 2 
B i: 3 
B i: 4 
B i: 5 

Est-ce possible?

+1

'async Consécutive' est une contradiction dans les termes, et est donc «async pour. – EJP

Répondre

0

J'obtenu la solution par moi-même:

private static Vertx vertx = Vertx.vertx(); 

    public static void main(String[] args) { 

     String alphabet = "AB"; 
     String[] splittedAlphabet = alphabet.split(""); 
     List<String> list = Arrays.asList(splittedAlphabet); 
     iterate(list.iterator()); 
    } 

    public static void iterate(Iterator<String> characters) { 
     if (characters.hasNext()) { 
      asyncCall(characters); 
     } else { 
      vertx.close(); 
     } 
    } 

    private static void asyncCall(Iterator<String> characters) { 
     List<Integer> numbers = new ArrayList<>(); 
     numbers.add(1); 
     numbers.add(2); 
     numbers.add(3); 
     numbers.add(4); 
     numbers.add(5); 

     Iterator<Integer> numberIterator = numbers.iterator(); 
     final String character = characters.next(); 

     vertx.setPeriodic(1000, id -> { 
      if (numberIterator.hasNext()) { 
       System.out.println(character + " i: " + numberIterator.next()); 
      } else { 
       vertx.cancelTimer(id); 
       iterate(characters); 
      } 
     }); 

    }