Java: 如何 运行 连续异步调用按顺序使用 Vertx?
Java: How to run consecutive async calls in order with 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
这可能吗?
我自己解决了:
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);
}
});
}
假设我们有以下情况:
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
这可能吗?
我自己解决了:
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);
}
});
}