我有以下 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
?我是不是做错了什么?
使用的方法
#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 未在指定时间内完成时抛出该异常