CompletableFuture 运行失序

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

我有以下 Java 代码(我使用 Oracle Java 17):

package com.test;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class Solution {
    public void startCompletableFutureExample() {
        CompletableFuture.runAsync(() -> {
                    System.out.println("async operation");
                })
                .completeOnTimeout(
                        timeout(), 10000, TimeUnit.MILLISECONDS);
    }

    private Void timeout() {
        System.out.println("timeout happens");
        return null;
    }
}

当我调用

startCompletableFutureExample()
方法时,我有以下输出:

timeout happens
async operation

虽然我希望得到唯一的一个,因为超时还没有结束:

async operation

为什么我要在

completeOnTimeout
之前运行方法
runAsync
?我是不是做错了什么?

java asynchronous future
1个回答
0
投票

使用的方法

#completeOnTimeout(T value, long timeout, TimeUnit unit)
接受价值而不是某种供应商。这意味着该值是在传递给方法之前计算的。

对于仅在超时时执行某些逻辑的情况 - 可以使用

#get(long timeout, TimeUnit unit)

简化版代码:

try {
    CompletableFuture.runAsync(() -> {
        System.out.println("async operation");
    }).get(1, TimeUnit.SECONDS);
} catch (TimeoutException e) {
    System.out.println("timeout happens");
}

这种方法将允许在遇到 TimeoutException 时执行代码,当 future 未在指定时间内完成时抛出该异常

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