Java:如何使用Vertx按顺序运行连续的异步调用?

时间:2017-09-05 20:52:26

标签: java loops asynchronous vert.x

假设我们有以下情况:

Async

我们有一个外部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 - 循环,它以索引号vertx.setPeriodic{}异步打印。外部i - 循环为内部for - 循环的每个索引号五次异步调用触发。这个内部循环遍历每个字符(在我们的例子中是'A'和'B')。这意味着每个索引号都与异步调​​用的每个字符组合在一起。这就是为什么输出中无法保证订单。 多数民众赞成在我得到的东西:

Vertx

但我想得的是(并保持内循环异步):

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

这可能吗?

1 个答案:

答案 0 :(得分: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);
            }
        });

    }