2017-09-05 73 views
0

可以說,我們有以下的情況:Java:如何按照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); 
     } 
    }); 

} 
} 

我們有一個外for -loop和內部vertx.setPeriodic{} -loop它打印異步索引號i。外部for -loop觸發每個索引號的五個異步調用內部的Vertx -Loop。這個內部循環遍歷每個字符(在我們的例子中是'A'和'B')。這意味着每個索引號都與每個被異步調用的字符組合在一起。這就是爲什麼在輸出中沒有訂單保證。 那是我得到了什麼:

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 

但我希望得到的是(並保持內循環異步):

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 

這可能嗎?

+1

「連續異步」是一個自相矛盾的,所以是「爲了異步」。 – EJP

回答

0

我有我自己的解決方案:

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); 
      } 
     }); 

    } 
相關問題