对于CompletableFuture,如果有一个任务阻塞超时了,你如何让其他任务直接返回?

我们要使用内部方法里的超时机制

1. 使用 timeout 配合 completeExceptionally

你可以使用 CompletableFuturecompleteExceptionally 方法在超时后主动让任务失败,并让其他任务继续执行。可以结合 CompletableFutureorTimeoutcompleteOnTimeout 方法来设置超时。

示例:
java


复制代码
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class CompletableFutureTimeoutExample {
    public static void main(String[] args) throws Exception {
        // 创建一个 CompletableFuture,模拟一个可能会超时的任务
        CompletableFuture future = new CompletableFuture<>();
        
        // 设置超时
        future.orTimeout(2, TimeUnit.SECONDS)
              .exceptionally(ex -> {
                  System.out.println("Task timed out!");
                  return "Timeout Result";
              });
        
        // 模拟任务阻塞,超过超时时间
        Thread.sleep(3000); // 3秒,超过2秒的超时设置
        
        // 模拟任务完成
        future.complete("Task completed");

        // 获取结果,超时后将返回默认值
        String result = future.join();
        System.out.println("Result: " + result);
    }
}

在上面的示例中:

  • orTimeout(2, TimeUnit.SECONDS) 设置了超时为2秒。
  • 如果任务没有在规定时间内完成,exceptionally 方法会被触发,任务将返回 "Timeout Result"。

2. 使用 completeOnTimeout

completeOnTimeout 方法也是设置超时的一种方式,区别在于它会在超时到达时自动完成 CompletableFuture,而不需要手动调用 completeExceptionally 或处理异常。

示例:
java


复制代码
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class CompletableFutureTimeoutExample {
    public static void main(String[] args) throws Exception {
        // 创建一个 CompletableFuture,模拟一个可能会超时的任务
        CompletableFuture future = new CompletableFuture<>();

        // 设置超时,如果超时就自动返回 "Timeout Result"
        future.completeOnTimeout("Timeout Result", 2, TimeUnit.SECONDS);
        
        // 模拟任务阻塞,超过超时时间
        Thread.sleep(3000); // 3秒,超过2秒的超时设置
        
        // 获取结果,超时后将返回默认值
        String result = future.join();
        System.out.println("Result: " + result);
    }
}

在这个示例中:

  • completeOnTimeout("Timeout Result", 2, TimeUnit.SECONDS) 会在2秒后自动完成 future,并返回指定的值 "Timeout Result"

你可能感兴趣的:(java,spring,boot,并发,异步,超时)