无法异步执行作业

问题描述 投票:0回答:1

我有一个非常令人困惑的问题。我正在组合几个

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());
            });
}
java asynchronous quarkus mutiny
1个回答
0
投票

虽然 Quarkus 支持异步编程,但它基于事件循环线程模型,其中承载任务/事件的 I/O 线程很少。因此,最重要的事情之一就是不要阻塞 I/O 线程。这正是您在代码中使用

Thread.sleep()

所做的事情

您可以在这里找到更多详细信息和解释:

https://quarkus.io/guides/quarkus-reactive-architecture

https://quarkus.io/guides/mutiny-primer

© www.soinside.com 2019 - 2024. All rights reserved.