CompletableFuture 它提供了多种方法来处理异步操作的结果。以下是 CompletableFuture 中 get()、join() 和 isDone() 方法的详细说明
时间: 2025-04-08 15:10:16 浏览: 52
### 关于 CompletableFuture 中 `get()`、`join()` 和 `isDone()` 的区别与用法
#### 1. 方法定义与行为差异
- **`get()` 方法**
`get()` 是继承自 `java.util.concurrent.Future` 接口的一个方法,用于阻塞当前线程直到任务完成并返回结果。如果任务抛出了异常,则会将其封装为 `ExecutionException` 并重新抛出[^1]。
- **`join()` 方法**
`join()` 是 `CompletableFuture` 提供的一种替代方案,其作用类似于 `get()`,但它不会抛出受检异常(checked exception),而是直接将未捕获的异常作为运行时异常(unchecked exception)抛出。因此,在使用 `join()` 时无需显式处理 `InterruptedException` 或 `ExecutionException`[^2]。
- **`isDone()` 方法**
`isDone()` 不会阻塞当前线程,它仅返回一个布尔值来指示该未来是否已经完成(无论是正常结束还是因异常终止)。此方法适用于需要轮询状态的应用场景[^3]。
#### 2. 返回值与异常处理机制
| 方法 | 阻塞性质 | 返回值类型 | 异常处理 |
|-----------|----------------|--------------------|------------------------------|
| `get()` | 阻塞 | 泛型 T | 抛出 `ExecutionException` |
| `join()` | 阻塞 | 泛型 T | 抛出 unchecked runtime 异常 |
| `isDone()`| 非阻塞 | 布尔值 (boolean) | 无 |
#### 3. 使用场景分析
- 当希望等待任务完成后获取具体的结果,并且能够接受强制处理可能发生的各种异常时,应优先考虑使用 `get()` 方法[^4]。
- 如果更倾向于简洁代码风格以及自动传播运行时错误而不必手动声明异常类,则推荐采用 `join()` 函数形式。
- 对于那些仅仅关心任务的状态而非实际产出数据的情形下,比如定时器逻辑或者监控程序里频繁查询作业进度等情况,可选用轻量级检测手段即调用 `isDone()` 来判断任务是否完结即可。
```python
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class Example {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
try { Thread.sleep(1000); } catch(Exception e){}
return 42;
});
System.out.println(future.isDone()); // 输出 false
Integer resultGet = future.get(); // 可能抛出 Exception
Integer resultJoin = future.join(); // 自动传播 RuntimeException
System.out.println(resultGet.equals(resultJoin)); // true
System.out.println(future.isDone()); // 输出 true
}
}
```
阅读全文
相关推荐



















