我有一个非常令人困惑的问题。我正在组合几个
Uni<Integer>
,分别需要 4、6 和 8 秒。我期望它们能够异步执行,这意味着总共只需要 8 秒(最长)。然而,当我运行代码时,需要 18 (4 + 6 + 8) 秒才能完成。
我哪里做错了?
我的代码:
public Uni<Integer> asyncTask(int idx, int delay) {
return Uni.createFrom().item(Unchecked.supplier(() -> {
// Perform your asynchronous operation here
// Simulate a delay
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(new Date() + " " + delay);
return idx; // Example result
}));
}
public void executeAsyncTasks() {
Date startTime = new Date();
Uni.combine().all()
.unis(asyncTask(1, 4000), asyncTask(2, 6000), asyncTask(3, 8000))
.asTuple()
// Subscribe (which will trigger the calls)
.subscribe().with(tuple -> {
System.out.println("item 1: " + tuple.getItem1());
System.out.println("item 2: " + tuple.getItem2());
System.out.println("item 3: " + tuple.getItem3());
Date finishTime = new Date();
System.out.println(finishTime.getTime() - startTime.getTime());
});
}
虽然 Quarkus 支持异步编程,但它基于事件循环线程模型,其中承载任务/事件的 I/O 线程很少。因此,最重要的事情之一就是不要阻塞 I/O 线程。这正是您在代码中使用
Thread.sleep()
所做的事情
您可以在这里找到更多详细信息和解释: